ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript : promise实现异步循环

2021-08-30 16:31:59  阅读:133  来源: 互联网

标签:异步 resolve javascript 调用 promise 执行 方法


需求场景大概就是:调用的方法是异步的。需要遍历参数,循环调用这个方法。拿到所有方法执行的结果,才能进行下一步。

所以说,需要在循环里面执行异步方法,然后正确拿到所有结果。

刚面临这个问题的时候我是拒绝的,对于我这个还没出新手村的菜鸟来说,异步,还循环,离谱,总不能callback一层一层套进去吧。

然后我想到了递归,但是有风险,递归不好处理异常,挂一个倒一片。

最终选择的处理方式是:promise和promise.all()。

promise 简单示例:
var promise = new Promise(function(resolve, reject) {
	// resolve()在方法执行完成时调用,告诉程序方法执行完了
	// reject()在方法执行异常时调用,告诉程序方法挂了
	...此处是一个异步方法
	if(异步方法执行成功){
		// 可以传参
		resolve(successData);
	}else if(异步方法执行失败){
		// 可以传参
		reject(failedData);
	}
});

promise.then(function(data){
	// 进入这个方法,意味着promise里面的方法执行完成,
	// promise的状态变成fulfilled或者rejected
	// data 就是resolve()或者reject传过来的参数
	console.log("异步方法执行完成...");
})

promise简单粗陋地解释,它就是一个对象,它的一生有三种状态:pending(进行中),fulfilled(执行成功),rejected(执行失败),并且三种状态互斥。

promise从诞生伊始处于Pending状态,调用resolve()方法可以使其变成fulfilled状态,调用reject()方法可以使其变成rejected状态。

fulfilled状态和rejected状态都能触发then()方法。

再通俗点说就是,在promise对象里写一段异步执行的代码,当这段代码执行完毕的时候,调用resolve()方法,调用resolve()方法,调用resolve()方法,那么就能触发then()方法。

then()方法是可以链式写下去的,但是需要在上一个then()方法里返回一个新的promise对象。

现在进入正题,怎么循环异步

核心方法就是:创造一个promise数组promiseArray,然后调用Promise.all(promiseArray).then(function(data){});

Promise.all会在整个promise数组里的promise执行完成以后,调用then()方法,并且返回所有promise的参数。

例子:

var promiseArray = [];
for(var i = 0;i<10;i++){
	promiseArray.push(new Promise(function(resolve,reject){
		console.log("创建了一个promise");
		...//一段异步代码
		if(异步执行成功){
			// 改变promise的状态,告诉程序这个promsie执行完成并执行成功了
			resolve(data);
		}else if(异步执行失败){
			// 改变promise的状态,告诉程序这个promsie执行失败了
			reject(data);
		}
	}));
}
Promise.all(promiseArray).then(data){
	console.log("所有promise执行完成");
	// 并且所有执行的结果都在data里面了,处理它们吧
}

promise 异步循环,能用,好用,感恩的心,感谢promise.

记得调resolve()方法哦。

标签:异步,resolve,javascript,调用,promise,执行,方法
来源: https://www.cnblogs.com/northwest332/p/15206558.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有