gpt4 book ai didi

javascript - 单独处理数组中的多个 promise

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:08:09 24 4
gpt4 key购买 nike

我有一个函数可以调用我的服务器并返回一组 promise 。

然而,其中一些调用可能有效,而另一些则可能无效。我的功能当前设置的方式,如果其中一个失败,它会警告整个事情都失败了。如果我打 5 次电话,可能有 1 次失败。我需要正确记录这个,但我不确定该怎么做。

理想的响应/日志应该是:

  1. 调用 1 通过
  2. 调用 2 通过
  3. 电话 3 通过
  4. 调用 4 失败 - 原因
  5. 调用 5 通过

现在整个事情将返回“句柄用户操作失败”,因为调用 4 失败。

功能:

var manageGroup = function (add, group, users){

var deffered = $q.defer();
var arrPromises = [];
var promiseIndex = arrPromises.length;
var usersLength = users.length;
var operation = add ? "AddUserToGroup" : "RemoveUserFromGroup";
var actionText = add ? "Added: " : "Removed: "
var actionText2 = add ? " to " : " from "

//Apply operation on selected groups
for (var i = 0; i < usersLength; i++){
arrPromises[i] = $().SPServices({
operation: operation,
groupName: group.name,
userLoginName: users[i].domain
});
}

$q.all(arrPromises).then(
function (){
//when promises are finsihed
for (var i = 0; i < usersLength; i++){
console.log(actionText + users[i].name + actionText2 + group.name);
};
deffered.resolve();
},
//function incase of AJAX failure
function (){
alert('The handle user operation failed.');
}
)
return deffered.promise;
}

我试图单独处理 promise 而不是使用 $q.all 但现在我在日志中没有得到任何东西:

我把这部分拿出来了:

/*$q.all(arrPromises).then(
function (){
//when promises are finsihed
for (var i = 0; i < usersLength; i++){
console.log(actionText + users[i].name + actionText2 + group.name);
};
deferred.resolve();
},
//function incase of AJAX failure
function (){
alert('The handle user operation failed.');
}
) */

改为引入这个:

for (var i = 0; i<promiseIndex; i++){
arrPromises[i].then(
function (){
console.log(actionText + user[i].name + actionText2 + group.name);
}
),
function (){
alert('Failed to add/remove'+ user[i].name + ' to ' + group.name)
}
}

$q.all(arrPromises).then(function (){
deferred.resolve();
}, function (){
deferred.reject();
})

最佳答案

Q (ng.$q 的基础)或 bluebird有一种方法可以完全满足您的需求。

对于 bluebird ,你会这样做:

var Promise = require('bluebird');

Promise.settle(arrPromises).then(function(promises) {
promises.forEach(function(p) {
if (promise.isRejected()) {
// it's a rejected promise.
}
else {
// it's a resolved promise.
}
});
});

对于 Q,你会这样做:

var Q = require('q');

Q.allSettled(arrPromises).then(function(promises) {
promises.forEach(function(p) {
if (p.state === 'fulfilled') {
// it's a resolved promise.
}
else {
// it's a rejected promise.
}
});
});

这两个库的好处在于它们都符合 Promises/A+ 规范。这意味着您可以取消 ng.$q,放入其中一个,您当前的代码仍然可以工作。

关于javascript - 单独处理数组中的多个 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21582821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com