编辑
#1的代码。 继续重试,直到承诺解决为止(该语言是否有任何改进社区?)
Promise.retry = function(fn, times, delay) {
return new Promise(function(resolve, reject){
var error;
var attempt = function() {
if (times == 0) {
reject(error);
} else {
fn().then(resolve)
.catch(function(e){
times--;
error = e;
setTimeout(function(){attempt()}, delay);
});
}
};
attempt();
});
};
采用
work.getStatus()
.then(function(result){ //retry, some glitch in the system
return Promise.retry(work.unpublish.bind(work, result), 10, 2000);
})
.then(function(){console.log('done')})
.catch(console.error);
#2的代码会 继续重试,直到条件then
以可重用的方式满足条件为止(条件会有所不同)。
work.publish()
.then(function(result){
return new Promise(function(resolve, reject){
var intervalId = setInterval(function(){
work.requestStatus(result).then(function(result2){
switch(result2.status) {
case "progress": break; //do nothing
case "success": clearInterval(intervalId); resolve(result2); break;
case "failure": clearInterval(intervalId); reject(result2); break;
}
}).catch(function(error){clearInterval(intervalId); reject(error)});
}, 1000);
});
})
.then(function(){console.log('done')})
.catch(console.error);
有点不同…
异步重试可以通过构建.catch()
链来实现,这与更常见的.then()
链相反。
这种方法是:
否则,请使用递归解决方案。
首先,将一个实用程序函数用作.catch()
回调。
var t = 500;
function rejectDelay(reason) {
return new Promise(function(resolve, reject) {
setTimeout(reject.bind(null, reason), t);
});
}
现在,您可以非常简洁地构建.catch链:
1.重试,直到承诺解决为止
var max = 5;
var p = Promise.reject();
for(var i=0; i<max; i++) {
p = p.catch(attempt).catch(rejectDelay);
}
p = p.then(processResult).catch(errorHandler);
2.重试直到结果达到一定条件,不要拖延
var max = 5;
var p = Promise.reject();
for(var i=0; i<max; i++) {
p = p.catch(attempt).then(test);
}
p = p.then(processResult).catch(errorHandler);
3.重试直到结果满足一定条件,然后延迟
考虑到(1)和(2)之后,组合的test + delay同样是微不足道的。
var max = 5;
var p = Promise.reject();
for(var i=0; i<max; i++) {
p = p.catch(attempt).then(test).catch(rejectDelay);
// Don't be tempted to simplify this to `p.catch(attempt).then(test, rejectDelay)`. Test failures would not be caught.
}
p = p.then(processResult).catch(errorHandler);
test()
可以是同步或异步的。
添加更多测试也将是微不足道的。只需在两个鱼钩之间夹上一串炸薯条即可。
p = p.catch(attempt).then(test1).then(test2).then(test3).catch(rejectDelay);
所有版本均设计为attempt
可返回承诺的异步功能。还可以想象它返回一个值,在这种情况下,链将遵循其成功路径到达next / terminal.then()
。
编辑 继续重试直到promise解决的模式(具有延迟和最大重试次数) #1的代码。不断重试,直到promise解决为止(语言社区有任何改进吗?) 使用 #2的代码继续重试,直到以可重用的方式产生结果(条件是会发生变化的)。
灰烬检查员根据其状态提供承诺,例如已Fulfilled, Pending和已Rejected 。 单击Promises选项卡,您将看到具有指定状态的Promises列表。 如上面的屏幕截图所示,您可以使用Rejected, Pending和Fulfilled选项来过滤承诺。 您还可以使用搜索框搜索承诺。 您可以使用Trace promises选项Trace promises 。 默认情况下,此选项
问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困
共3轮面试 一面 感觉挺好的,一进公司前台小姐姐就很热情的接待了我,完了还很贴心的给我一瓶水,再就去面试间扫描二维码填一些个人资料,感觉很方便,都不用手写,填完大概两三分钟,对接的人事小姐姐就拿着打印出来我填写的那份资料过来了, 一点都不严肃,态度很温柔,问一下过来耗费的时间和过来的方式,人事主要还是了解个人客观的情况,还让我多问一些自己不清楚的问题,没得什么架子之类的,感知度很好~ 二面
问题内容: 我从控制器内部的异步服务获取数据,如下所示: 我的问题: 当我从服务中获得错误而又不返回承诺时,如何再次查询服务。 在我的服务中这样做会更好吗? 谢谢! 问题答案: 您可以在服务本身而不是控制器中重试该请求。 因此,可能是这样的: 您可以摆脱控制器中的错误功能:
问题内容: 问题1:在给定的时间只允许一个API请求,因此,真正的网络请求在尚未完成的情况下排队。应用可以随时调用API级别,并且期望得到回报。当API调用排入队列时,将在将来的某个时刻创建对网络请求的承诺- 返回什么给应用程序?这样可以通过延迟的“代理”承诺来解决: 问题2:对一些API调用进行反跳动,以便随着时间的推移累积要发送的数据,然后在达到超时时分批发送。调用API的应用期望得到回报。