我一直在试图找出如何最好地实现重试,例如,一个失败的下载使用承诺。我最好的猜测是用一个新的承诺来解决一个承诺(请参阅下面的伪代码),但是我在文档中所能找到的就是Promise.resolve()可以用一个可处理的(因此,我相信,用一个承诺)来调用。这也适用于允诺构造函数中的解析回调吗?我的方法是正确的还是有更好的方法来实现重试?
function getdata(url) {
return new Promise(function(resolve, reject) {
ajaxcall({
url: url,
success: function(data) { resolve(data); },
failure: function(err) {
if(retriable(err)) {
resolve(getdata(url));
}
else {
reject(err);
}
}
});
});
}
发布于 2017-01-18 23:18:40
你的方法会奏效的。当承诺传递给允诺构造函数的解析回调时,该承诺的解析值将用作“外部”承诺的解析值。
将ajaxcall
封装在一个返回承诺的函数中可能会更干净,这样您就不会混合和匹配承诺和回调范式。
function fetch(url) {
return new Promise(function(resolve, reject) {
ajaxcall({
url: url,
success: resolve,
failure: reject
});
});
}
function getdata(url) {
return fetch(url)
.catch(function(err) {
if(retriable(err)) {
return getdata(url); // or fetch(url) to retry only once
} else {
throw err;
}
});
}
发布于 2017-01-18 23:22:52
您可以更改代码以调用内部函数。就像这样:
function getdata(url) {
return new Promise(function(resolve, reject) {
function call() {
return ajaxcall({
url: url,
success: function(data) { resolve(data); },
failure: function(err) {
if(retriable(err)) {
call();
}
else {
reject(err);
}
}
});
}
call();
});
}
https://stackoverflow.com/questions/41731121
复制相似问题