Bat*_*man 3 javascript angularjs
我有一个函数,它对我的服务器进行Web服务调用并返回一个promises数组.
然而,其中一些调用可能有效,而其他调用可能无效.我的函数当前设置的方式,如果其中一个失败,它会警告整个事情都失败了.如果我正在拨5个电话,1可能会失败.我需要正确记录,我不知道该怎么做.
理想的响应/日志是:
现在整个事情将返回"句柄用户操作失败",因为调用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;
}
Run Code Online (Sandbox Code Playgroud)
我试图单独处理promises而不是使用$ 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.');
}
) */
Run Code Online (Sandbox Code Playgroud)
相反介绍:
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();
})
Run Code Online (Sandbox Code Playgroud)
Q(基于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.
}
});
});
Run Code Online (Sandbox Code Playgroud)
对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.
}
});
});
Run Code Online (Sandbox Code Playgroud)
这两个库的好处在于它们符合Promises/A +规范.这意味着您可以取消.$ q,放置其中一个,您当前的代码仍然有用.
| 归档时间: |
|
| 查看次数: |
3115 次 |
| 最近记录: |