在 nodejs 中使用 Q.js promise 进行循环的正确方法
Correct way to make loop with Q.js promise in nodejs
希望有人能帮助我更好地理解承诺。
我对他们很菜鸟。
我正在做一个有承诺的数据库查询,当结果正确时得到一个数据数组。然后我需要循环迭代这个数组并为每个元素执行删除操作,然后删除操作到另一个发送操作,当两个操作完成时,然后对数组的每个元素重复该过程,但必须完成每个元素在开始另一个数组元素之前完成操作和发送操作...使用我的代码不会发生,循环对每个元素进行删除操作而不等待删除和发送操作 return 结果....
操作 delete 和 shipping 都具有结构
function x (makeQuery){
.......
var deferred = Q.defer();
.....
function(err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
});
return deferred.promise;
}
我的代码是:
getElementInPostgres(makeQuery)
.then(function (obj) {
if (...){
results= obj['rows']
index =0
for (var i = 0; i < results.length; i++) {
var notification = {}
notification.tag='SubscriptionNode'
notification.indexSocket=results[i]['indexsocket']
notification.clientID=results[i]['clientid']
notification.callbackURL=results[i]['callbackurl']
notification.deploymentID=results[i]['deploymentid']
notification.clusterID=results[i]['clusterid']
notification.date=results[i]['registered']
var query = "DELETE FROM.....";
var params = [notification.indexSocket];
deleteInPostgres(query,params,notification)
.then(function (notification) {
if(notification.clientID){
sendInfoToPython(notification)
.then(function (obj) {
..........
}).fail(function (err) {
......
});
}
}).fail(function (err) {
......
});
}
}
else{
.........
}
}).fail(function (err) {
});
您可以继续使用 Q 但要迭代第一个结果,您可以使用 async.each (https://github.com/caolan/async#each) 。在迭代器中,您可以执行删除任务。在迭代的回调中恢复您的发送操作。它将使您的代码更简单、更简洁
希望有人能帮助我更好地理解承诺。 我对他们很菜鸟。 我正在做一个有承诺的数据库查询,当结果正确时得到一个数据数组。然后我需要循环迭代这个数组并为每个元素执行删除操作,然后删除操作到另一个发送操作,当两个操作完成时,然后对数组的每个元素重复该过程,但必须完成每个元素在开始另一个数组元素之前完成操作和发送操作...使用我的代码不会发生,循环对每个元素进行删除操作而不等待删除和发送操作 return 结果.... 操作 delete 和 shipping 都具有结构
function x (makeQuery){
.......
var deferred = Q.defer();
.....
function(err, result) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(result);
}
});
return deferred.promise;
}
我的代码是:
getElementInPostgres(makeQuery)
.then(function (obj) {
if (...){
results= obj['rows']
index =0
for (var i = 0; i < results.length; i++) {
var notification = {}
notification.tag='SubscriptionNode'
notification.indexSocket=results[i]['indexsocket']
notification.clientID=results[i]['clientid']
notification.callbackURL=results[i]['callbackurl']
notification.deploymentID=results[i]['deploymentid']
notification.clusterID=results[i]['clusterid']
notification.date=results[i]['registered']
var query = "DELETE FROM.....";
var params = [notification.indexSocket];
deleteInPostgres(query,params,notification)
.then(function (notification) {
if(notification.clientID){
sendInfoToPython(notification)
.then(function (obj) {
..........
}).fail(function (err) {
......
});
}
}).fail(function (err) {
......
});
}
}
else{
.........
}
}).fail(function (err) {
});
您可以继续使用 Q 但要迭代第一个结果,您可以使用 async.each (https://github.com/caolan/async#each) 。在迭代器中,您可以执行删除任务。在迭代的回调中恢复您的发送操作。它将使您的代码更简单、更简洁