笔者在for循环中进行Promise异步操作的时候,主要会遇到两个问题:
-
一是如何让所有的for循环中的Promise操作结束后执行某个操作
-
二是循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(例如对于某个数据库操作)
问题1,如何让for循环中的Promise全部完成后执行某个操作?
解决方法有两种,方法一是通过一个初始化为0的变量,对于for循环中的每一个Promise都在resolve回调中对其+1,当判断到其值与循环数一致时,则表示for循环中的Promise全部执行完成了
代码如下:
let flag=0;
for(let i=0;i<LEN;i++){
//异步操作
xxx.exec((i)=>{
flag++;
if(flag===LEN){
console.log("All Promise finished");
xxx.exec(i).then(()=>{
flag++;
if(flag===LEN){
console.log("All Promise finished");
方法二是将for循环放在Promise的then链中,如果for循环的上一级本身就是Promise则直接then即可,如果不是则自己new一个空的Promise
代码如下:
.then(()=>{
for(let i=0;i<10;i++){
//异步操作
xxx.exec(i);
.then(()=>{
console.log("All Promise finished");
如果上级不是一个Promise,则自己new一个
new Promise(function(resolve){
resolve();
}).then(()=>{
for(let i=0;i<10;i++){
//异步操作
xxx.exec(i);
}).then(()=>{
console.log("All Promise finished");
问题2,循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(即必要等当前Promise执行完了再进行下次循环)
解决方法有两种,方法一是通过递归,递归的次数即为循环的次数并且是在异步的回调中进行触发递归.
代码如下:
function loopArray(x) {
xxx.exec().then( () => {
if ( x < LEN ) {
console.log("当前异步完成了,可以进行下次循环");
loopArray( x);
} );
loopArray(0);
方法二则是通过async与await(推荐node环境为node8而不是安装依赖包)
async function loopArray() {
for ( let i=0; i<LEN; i++ ) {
//await的必须是个Promise
await xxx.exec().then(()=>{
console.log("当前异步完成了,可以进行下次循环");
笔者在for循环中进行Promise异步操作的时候,主要会遇到两个问题: 一是如何让所有的for循环中的Promise操作结束后执行某个操作 二是循环中如果后一个Promise的执行依赖与前一个Promise的执行结果(例如对于某个数据库操作)
写个超简单的demo,复制就能用:
使用场景: 有多个ajax请求,需要在所有请求都返回结果后回调,执行其他操作。
let len = 10; //循环次数(实际按需求修改)
let arr = []; //promise返回值的数组
for (let i = 0; i < len; i++) {
arr[i] = new Promise((resolve, reject) => {
setTimeou
上一篇文章写了使用Promise进行异步操作:使用Promise来进行异步操作。
这适用于单条数据的处理场景,如果是在for循环中处理多条数据,依次处理每条数据的异步操作呢?
思路:还是利用Promise的then()来进行链式操作,每次循环的时候往Promise后添加一个新的then(),这样就可以保证上一个数据的异步操作执行完毕再执行下一个数据的异步操作。
示例代码:
const promise = Promise.resolve();
for(let index in newArray){
promise = promise.then(()=>{
return asyncOp
一种非阻塞异步执行的抽象概念.
如果我们想在promise之后执行某些操作,只能通过then回调(请求成功时)或者catch回调(请求失败时),整个函数又会返回一个promise,只会在then里执行下一步操作.
let success = Promise.resolve("success");
let failure = Promise.reject("failur...
在 Node.js 中,由于其异步非阻塞的特性,通常会使用回调函数或者 Promises 来处理异步操作。在 for 循环中使用异步函数时,可以使用以下几种方法来同步运行异步函数:
1. 使用 async/await
可以将 for 循环放在 async 函数中,然后在 for 循环内部使用 await 来等待异步函数的执行结束。
async function main() {
for (let i = 0; i < 5; i++) {
const result = await asyncFunction(i);
console.log(result);
main();
2. 使用 Promise.all
可以将 for 循环中的每个异步操作封装成一个 Promise 对象,然后使用 Promise.all 来等待所有 Promise 对象都执行完毕。
const promises = [];
for (let i = 0; i < 5; i++) {
promises.push(asyncFunction(i));
Promise.all(promises).then((results) => {
console.log(results);
3. 使用循环内嵌回调函数
在 for 循环内部使用回调函数的方式也可以同步运行异步函数。
function main() {
for (let i = 0; i < 5; i++) {
asyncFunction(i, (result) => {
console.log(result);
main();
注意:在使用回调函数的方式时,需要确保回调函数在异步操作完成之后被执行,否则会导致循环执行的顺序错乱。