如何使for循环与async.parallel()一起工作
how to make a for loop work with a async.parallel()
我正在使用Sails、Waterline和Async库
function Outerfunction(listOfProducts) {
var salesOrderId = 1; //some id
var prom = [];
for (var i = 0; i < listOfProducts.length; i++) {
var qty = listOfProducts[i].quantity;
var prod = listOfProducts[i].productName;
var update = function(qty, prod, SalesOrderId) {
CardImages.update({
where: {
productName: prod,
isSold: false,
readyToSell: true
}
}, {
order: SalesOrderId,
isSold: true
})
.exec(function(err, updatedRecords) {
if (err) return err;
return updatedRecords;
});
}
prom.push(update);
}
async.parallel(prom, function(err, result) {
//this callback never gets called
console.log("database calls done");
});
}
我正在尝试使用for循环更新数据库,这段代码运行良好并更新数据库,但当所有记录都更新时,我的async.parallel
回调不会被调用。
您要查找的函数是async.map
,它将向数组中的每个元素应用一个异步函数,并使用结果数组进行回调。我不能测试这个,但像这样的东西应该可以工作:
function OuterFunction(listOfProducts) {
var salesOrderId = 1; // some id
async.map(listOfProducts, function (product, done) {
// for each product, update its DB entry
CardImages.update({
productName: product.productName,
isSold: false,
readyToSell: true
}, {
order: salesOrderId,
isSold: true
}).exec(done); // indicate that async work is done
}, function (err, result) {
// all finished
console.log('database calls done');
});
}
请注意,此解决方案根本不使用Promises。这只是基于回调的异步工作。
我没有与Waterline合作过,但根据我在(相当糟糕的)文档中很快发现的内容,这也是一个可能的解决方案:
function OuterFunction(listOfProducts) {
var salesOrderId = 1; // some id
// extract product names
var productNames = listOfProducts.map(function (product) {
return product.productName;
});
// update in bulk
CardImages.update({
productName: productNames,
isSold: false,
readyToSell: true
}, {
order: salesOrderId,
isSold: true
}).exec(function (err, results) {
// all finished
console.log('database calls done');
});
}
翻译成SQL,第一个解决方案将发出(大致)
UPDATE table SET isSold = TRUE, readyToSell = FALSE
WHERE productName = 'product 1' AND isSold = FALSE AND readyToSell = TRUE;
UPDATE table SET isSold = TRUE, readyToSell = FALSE
WHERE productName = 'product 2' AND isSold = FALSE AND readyToSell = TRUE;
UPDATE table SET isSold = TRUE, readyToSell = FALSE
WHERE productName = 'product 3' AND isSold = FALSE AND readyToSell = TRUE;
...
第二个会发射更有效的
UPDATE table SET isSold = TRUE, readyToSell = FALSE
WHERE productName IN ('product 1', 'product 2', 'product 3', ...)
AND isSold = FALSE AND readyToSell = TRUE;
相关文章:
- 如何在php中创建一个函数,该函数与文本区域一起工作,通过输入类似[color:red]的内容来打印具有等效颜色的文本
- document.title函数可以't设置它与php一起工作
- "此网站似乎使用滚动链接定位效果.这可能不能很好地与异步平移一起工作;
- 非常简单的js测试;Don’不要和Minko一起工作
- 无法使我的文本参数与我的查询一起工作
- 为什么Angularjs验证don't与输入[type=“number”]一起工作
- 无法使vash 0.8.0与express 4.12.3一起工作
- 如何使Angular JS控制器与指令一起工作
- 无法使autocompletion与bootstrap和php代码点火器一起工作
- 注入的元素和jQuery脚本.如何让他们一起工作
- 两个独立工作的javascript函数,但不能一起工作
- 角度和砖石一起工作
- Node http-proxy-middleware 不能与本地服务器一起工作
- jQuery脚本不想一起工作
- page.js使examples/hash与hashbang:true一起工作
- javascript使jquery倒计时与UTC时间一起工作
- jQuery.not()选择器无法与类一起工作
- Rails3-可排序列表不能与wysihtml5一起工作
- 替换匹配函数给出了未定义的错误,但它与替换一起工作
- 按钮上的数据加载消息无法与ajax调用一起工作