首页 新闻 会员 周边

求关于for循环去调用API,等所有API调用完后,promise实现将其中哪几次调用失败了的错误提示打印出来?

0
悬赏园豆:10 [待解决问题]
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循环去调用10API,其中第3次和第6次出错了,等所有API调用完毕之后,我要把这两次的错误信息打印出来,告诉用户,
有没有大神用过promise的,求解答
})
}
山不走来,我便走去的主页 山不走来,我便走去 | 初学一级 | 园豆:192
提问于:2017-05-22 14:29
< >
分享
所有回答(1)
0

因为Proimise.all一出错就是退出。所以我们需要把每个请求都包装一次,全部包装为resolve,当然,出错的话,我们需要给一个标记。

function req(){

  if(请求出错) {

    return resolve({error: true, message: '错误信息'})
  }

}

幻天芒 | 园豆:37175 (高人七级) | 2017-05-22 15:11

感谢您的回答,我的问题已经解决了,我也是不管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的行为,那就只能自己折腾一套规则了。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2017-05-23 22:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册