javascript - 如何在 ES6 中重试 Promise

标签 javascript node.js ecmascript-6 promise es6-promise

<分区>

我一直在努力弄清楚如何最好地实现重试,例如使用 promises 下载失败。我最好的猜测是用一个新的 promise 解决一个 promise(见下面的伪代码),但我在文档中所能找到的只是 Promise.resolve() 可以用一个 thenable 调用(所以,我相信,用一个 Promise ).这是否也适用于 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);
            }
         }
      });
   });
}

最佳答案

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

ajaxcall 包装在一个 promise 返回函数中可能会更简洁,这样您就不会混合和匹配 promise 和回调范例。

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;
      }
    });
}

关于javascript - 如何在 ES6 中重试 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41731121/

相关文章:

node.js - 在 Azure 网站上使用 Node.js 进行图像处理

javascript - Webpack 使用 AMD 定义

javascript - 使用对象数组中的键查找 lastIndexOf() 对象

javascript - 字符串拆分为 javascript 对象

JavaScript - 当 if 语句为真时,代码不执行?

javascript - 向对消息使用react的人发送 DM - Discord JS

javascript - ES6 解构

javascript - 如何在 chrome 扩展中动态运行后台脚本?

javascript - 在 <img> 标签中显示 Canvas 图像的一部分

node.js - 将 UTF-8 csv 文件转换为 Excel 可读的 csv