示例: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
答案 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);