我试图用Promise(Q)重写我的一个项目的代码。我不知道如何在一个foreach循环中采用一连串的诺言的结果:
var resProducts = [];
products.forEach(currProduct) {
Stock.saveNewStock(currProduct)
.then(function(res1) {
Product.saveNewProduct(currProduct)
.then(function(res2) {
resProducts.push(res2);
Product.addStockToProduct(res1,res2)
})
})
.catch(function(err) {
console.log(err)
})
});
console.log(resProducts);
Run Code Online (Sandbox Code Playgroud)
我看到每次日志标记一个空数组时,如何解决它?
您应该始终返回所有的Promise,而您在这里的多个地方都忘记了。
如果可以使用=>箭头函数,则这些函数将隐式返回,从而避免忘记。
代替forEach使用忽略返回值,而是使用map结果并将其返回到数组中。这也可以并行进行:
Promise.all(products.map(product => Stock.saveNewStock(product)
.then(res1 => Product.saveNewProduct(product)
.then(res2 => Product.addStockToProduct(res1, res2)
.then(() => res2))))
.then(resProducts => console.log(resProducts))
.catch(err => console.error(err));
Run Code Online (Sandbox Code Playgroud)
这里筑巢是故意的,访问res1和res2在一起。
您需要这样的东西吗?
var defer = $q.defer();
var promises = [];
var resProducts = [];
var errorCallback = function (e) {
defer.reject();
};
products.forEach(currProduct) {
promises.push(function () {
Stock.saveNewStock(currProduct)
.then(function(res1) {
return Product.saveNewProduct(currProduct)
.then(function(res2) {
resProducts.push(res2);
Product.addStockToProduct(res1,res2)
})
})
.catch(function(err) {
console.log(err)
})
}
);
}
});
return $q.all(promises);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4675 次 |
| 最近记录: |