Javascript 单独处理阵列中的多个承诺
我有一个函数,可以对我的服务器进行web服务调用,并返回一系列承诺 但是,其中一些调用可能有效,而其他调用可能无效。我的函数当前的设置方式是,如果其中一个函数失败,它会提醒整个函数失败。如果我打5个电话,1个可能会失败。我需要正确地记录这个,我不知道怎么做 理想的响应/日志是:Javascript 单独处理阵列中的多个承诺,javascript,angularjs,Javascript,Angularjs,我有一个函数,可以对我的服务器进行web服务调用,并返回一系列承诺 但是,其中一些调用可能有效,而其他调用可能无效。我的函数当前的设置方式是,如果其中一个函数失败,它会提醒整个函数失败。如果我打5个电话,1个可能会失败。我需要正确地记录这个,我不知道怎么做 理想的响应/日志是: 呼叫1已通过 呼叫2已通过 呼叫3已通过 呼叫4失败-原因 呼叫5已通过 现在整个过程将返回“句柄用户操作失败”,因为调用4失败 功能: var manageGroup = function (add, group, u
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;
}
var manageGroup=函数(添加、组、用户){
var defered=$q.defer();
var=[];
var promiseIndex=Arr.length;
var usersLength=users.length;
var operation=add?“AddUserToGroup”:“RemoveUserFromGroup”;
var actionText=add?“添加::”删除:“
var actionText2=将“添加到”:“从”
//对所选组应用操作
对于(var i=0;i
我试图单独处理这些承诺,而不是使用$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.');
}
) */
/*$q.all(arr承诺)。然后(
函数(){
//当承诺兑现时
对于(var i=0;i
而是引入了以下内容:
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();
})
for(var i=0;i(ng.$q基于此)或拥有一种完全满足您需求的方法
对于蓝鸟,您可以这样做:
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.
}
});
});
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.
}
});
});
对于Q,您可以这样做:
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.
}
});
});
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,放上其中一个,你当前的代码仍然可以工作
我试图单独处理这些承诺,而不是使用$q.all,但现在我在日志中什么都没有了
执行回调时,您的i
变量的值错误,您似乎爱上了。请使用以下方法:
for (var i = 0; i<promiseIndex; i++) (function(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)
});
})(i);
for(var i=0;i您似乎遇到了一个问题,一个ajax调用失败导致all()
的整体失败。您可以捕获单个ajax调用的失败,并使用您选择的值解决相应的承诺。在这里,我只是使用一个空字符串
请记住,这只是演示这一点的示例代码
//store promises to use for all()
var promises = [];
//loop for ajax calls
for (var i=0; i<3; ++i) {
//new deferred for each call
var deferred = $q.defer();
//cache the promise
promises[i] = deferred.promise;
//use another function to avoid unwanted variable increment
makeCall(deferred, i);
}
$q.all(promises).then(function(allData) {
console.log(allData);
});
function makeCall(deferred, i) {
//make the ajax call
$http.get('file'+i+'.txt').then(function(resp) {
console.log('Call '+i+' returned.');
//resolve the promise with ajax data if successful
deferred.resolve(resp.data);
}, function() {
//resolve with something else on failure
deferred.resolve('');
});
}
//存储承诺用于所有()
var承诺=[];
//用于ajax调用的循环
对于(var i=0;iYou没有使用jQuery的延迟,是吗?什么是$q.all
,Angular的q承诺实现?是的,我的错误,这是Angular的承诺实现。我更新了标签。可能的重复不是我能说的重复。他说的是等待所有承诺解决。我在问我如何处理每个proQ和bluebird分别给出了一个名为allselled
或sellet
的方法。它准确地告诉您:一旦所有承诺都完成(解决或拒绝),调用时会列出这些承诺及其状态。嗯,这看起来非常简单。@Batman是的,这就是重点。这两个库都认识到它可能是一个常见的用例,并提供了一种处理方法。如果你开始大量使用承诺,你会发现这些库提供了更多,比如bind
或者spread
,这可能是非常宝贵的。你指出了正确的问题,但你的代码现在是错误的,肯定是打字错误。因为我在移动设备上,所以现在无法修复它。@Florian:怎么了?我没有发现任何语法错误。哦……那可能是移动应用程序出了问题。我一直在尝试这样做,但根本不起作用:我但是不要出错。您希望它做什么?您没有在任何地方调用manageGroup()
。我不理解$q.all(promises)的用途。然后(函数(allData))@蝙蝠侠你不想等待所有的调用完成吗?哦,是的,我当然想。就像我想记录每一个事务通过或失败,你的代码做得非常好。我试图让它在最后给我一个最终结果,比如“所有事务成功”或“操作完成但有错误”但是.all正在捕获第一个错误并进行解析,它在第一个错误之后立即调用my.final函数。我是这样做的:您可以看到我在这里的意思:高亮显示的日志应该在操作结束时调用,但调用得太早了。此外,我不能将解析或拒绝的参数传递到.fina中这正常吗?@Batman我没有时间调试你的代码。你需要知道的一切都在我的答案里。