在处理完数组中的所有项目时调用done()

时间:2017-05-22 13:32:08

标签: javascript foreach promise settimeout

示例:JSFiddle

[1,'a',2,'b'].forEach(function(item, i){
if (typeof item === 'number') {
setTimeout(function(){
    console.log(item * 2);
},1000)
  } else if (typeof item === 'string') {
    console.log(item);
  }
})
done();

function done(){
    console.log('done');
}

此代码返回:

a
b
done
2
4

如何更改代码,以便仅在处理完数组中的所有项目时调用done()? 即:

a
b
2
4
done

1 个答案:

答案 0 :(得分:2)

使用Promise s。
将每个流程包裹在Promise中,并在流程结束时解析 然后将所有Promise包装在Promise.all中,这会创建一个新的Promise,一旦所有包装的承诺解决后,它就会解析。
然后你打电话给done功能。

var processes = [1,'a',2,'b'].map(function(item){
  if (typeof item === 'number') {
    return new Promise(function(resolve) {
      setTimeout(function(){
        console.log(item * 2);
        resolve();
      },1000);
    });
  } else if (typeof item === 'string') {
    console.log(item);
    return Promise.resolve(); // A Promise that resolves immediately
  }
});
Promise.all(processes).then(done);

JSFiddle with your code modified as above