function refuse_refund(){
var err_mess={};
for (k = 0; k < 10; k++) {
var deferred= $.Deferred();
QN.top.invoke({//自己封装调用淘宝API的函数
method: 'post',
cmd: 'taobao.refund.refuse',
param:{},
success: function (rsp) {
console.log(rsp);
deferred.resolve(rsp);
},
error: function (msg) {
console.log(msg);
err_mess[k]=msg.sub_msg;//把错误信息以序号为属性名,错误信息为属性值存到err_mess对象里面 ,
例如: err_mess{ k : "msg.sub_msg", .... }
deferred.reject(err_mess);
}
})
}
deferred.then(function(rsp){
console.log(rsp);
},function(err_mess){
alert(err_mess);
此处等for循环调用API结束后,打印哪几次调用API时发生错误的返回信息,也就是err_mess。
但事与愿违,只打印了第一次的,而我要的是等for循环调用API结束后(**记住是所有API调用完毕之后,才去打印,所有API调用完毕之后,才去打印,所有API调用完毕之后,才去打印**,重要事情说三遍),
才打印哪几次调用API时发生错误的返回信息,比如用for循环去调用10次API,其中第3次和第6次出错了,等所有API调用完毕之后,我要把这两次的错误信息打印出来,告诉用户,
有没有大神用过promise的,求解答
})
}
因为Proimise.all一出错就是退出。所以我们需要把每个请求都包装一次,全部包装为resolve,当然,出错的话,我们需要给一个标记。
function req(){
if(请求出错) {
return resolve({error: true, message: '错误信息'})
}
}
感谢您的回答,我的问题已经解决了,我也是不管API调用成功还是失败,都resolve(),再在for循环把每个promise都push到一个数组,然后用$.when.apply(null, defereds).done(function (err_mess) {}来做的,我还是想问问这个function req(){}是放到error: function (msg) {}里面吗?
有没有什么方法可以在循环里使用promise,但有resolve()和reject()方法,然后
.then(function(rsp){
console.log(rsp); // 比如第1,2次都被resolve()了
},function(err){
console.log(err); //其他次数都被reject()了
})
@浪在前端: 非要改变Promise的行为,那就只能自己折腾一套规则了。