首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ES6中重试承诺

如何在ES6中重试承诺
EN

Stack Overflow用户
提问于 2017-01-18 23:12:06
回答 2查看 9.2K关注 0票数 1

我一直在试图找出如何最好地实现重试,例如,一个失败的下载使用承诺。我最好的猜测是用一个新的承诺来解决一个承诺(请参阅下面的伪代码),但是我在文档中所能找到的就是Promise.resolve()可以用一个可处理的(因此,我相信,用一个承诺)来调用。这也适用于允诺构造函数中的解析回调吗?我的方法是正确的还是有更好的方法来实现重试?

代码语言:javascript
运行
复制
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);
            }
         }
      });
   });
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-18 23:18:40

你的方法会奏效的。当承诺传递给允诺构造函数的解析回调时,该承诺的解析值将用作“外部”承诺的解析值。

ajaxcall封装在一个返回承诺的函数中可能会更干净,这样您就不会混合和匹配承诺和回调范式。

代码语言:javascript
运行
复制
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;
      }
    });
}
票数 4
EN

Stack Overflow用户

发布于 2017-01-18 23:22:52

您可以更改代码以调用内部函数。就像这样:

代码语言:javascript
运行
复制
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(); 
   });
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41731121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档