【发布时间】:2016-08-09 21:00:00
【问题描述】:
我遇到了一个让我有点发疯的情况。
所以情况如下:
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 完成。
【问题讨论】:
-
您忘记返回 Promise.all 的实际承诺。
return Promise.all(products.map (function (row){ return Service.importProcess(row); })); -
你真的不应该使用
async.series,因为你可以只使用promise。 -
@noppa 感谢您的回答,但这并不能解决问题
-
@Bergi 为什么不推荐?
-
@msecz:因为 Promise 比
async更好、更简单。在您的情况下,不返回来自importProcess的承诺甚至是您的代码不起作用的原因。
标签: javascript for-loop asynchronous callback promise