我遇到了一个让我有点发疯的情况。
所以情况如下:
module.exports = {
generation: function (req, res) {
// Let's firstly fetch all the products from the productTmp Table
function fetchProductsTmp (){
ProductsTmp.find().then(function (products) {
return Promise.all(products.map (function (row){
Service.importProcess(row);
}));
});
}
fetchProductsTmp();
}
在这里,我只是调用我的模型 ProductsTmp 来获取我的数据并通过调用 importProcess 遍历我的行。
导入过程:
importProcess: function (product) {
async.series([
function (callback) {
return SousFamille.findOne({name: product.sous_famille}).then(function (sf) {
console.log('1');
if (!sf) {
return SousFamille.create({name: product.sous_famille}).then(function (_sf) {
console.log('2');
callback(null, _sf.sf_id);
});
} else {
callback(null, sf.sf_id);
}
});
},
function (callback){
console.log('3');
},
], function(err, results){
if(err) return res.send({message: "Error"});
});
}
所以我得到了我的控制台日志: 1个 1个 1个 2个 3个 2个 3个 2个 3
我想要获得的是 1 2 3 1 2 3 1 2 3 这样每个函数在调用下一个之前等待 promise 完成。
最佳答案
在第一节的generation
函数中,替换
return Promise.all(products.map (function (row){
Service.importProcess(row);
}));
与
var results = [],
pushResult = id => results.push(id);
return products.reduce(function(prev, row){//Go through all the products
//Take the previous promise, and schedule next call to Service.importProcess to be
//made after the previous promise has been resolved
return prev.then(function(){
return Service.importProcess(row).then(pushResult);
});
}, Promise.resolve())
.then(() => results);
您还需要从 importProcess
返回一个 promise 才能工作。只需抛弃整个 async.series
东西,然后做一些类似的事情
return new Promise(function(resolve, reject){
...
resolve(sf.sf_id); //instead of the callback(null, sf.sf_id)
...
});
更新:这强制对 Service.importProcess 的调用是顺序的而不是并发的,这确实会影响对 generation
的调用的整体性能。但我猜你有比顺序 console.logs 更充分的理由这样做。
关于javascript - for循环中的 promise 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36688626/