【问题标题】:Promise - try until it succeds [duplicate]承诺-尝试直到成功[重复]
【发布时间】:2016-02-16 13:23:07
【问题描述】:

我正在使用本机 node.js 的 Promises,而问题 here 确实给了我任何一点。 基本上,我有如下功能:

var foo = foo (resolve, reject) {
    return obj
        .doA()
        .doB()
        .then(function (value) {
            // here I choose if I want to resolve or reject.
        })
        .catch(function(err) {
        });
}

var promise = new Promise(foo);

return promise
    .then(function() {
        // I know here what I have to return.
    })
    .catch(function(err){
        // I want to repeat the foo function until it is resolved and not rejected. 
    })

obj 是一个承诺的对象。只要承诺得到履行,我就想重试 foo 函数;如果被拒绝,请再试一次。

我不知道如何构建链。有什么帮助吗? 谢谢。

【问题讨论】:

  • 只要 promise 被履行和只要 promise 被拒绝都是 super 相似的。唯一的区别是检查.catch.then - 你可能想问如何将被拒绝的承诺转换为已履行的承诺,反之亦然。绝对是重复的。
  • 该副本中的答案似乎过于复杂并且不适合这个问题 - 恕我直言 - 并且无法解决此代码的一些基本问题,例如这段代码中根本不需要new Promise
  • @BenjaminGruenbaum 的副本?在使用 node.js 的本机 Promises 实现之前,我没有看到任何关于循环 Promise 的问题。请分享一个链接。谢谢。
  • Pfft,这已关闭的副本实际上是同一件事......但如果你必须有完全相同的场景:const retry = fn => _ => fn().catch(retry(fn))

标签: javascript node.js promise


【解决方案1】:

尝试在 foo 的声明中包含 function ,使用递归

function foo() {

  var n = String(new Date().getTime()).slice(-1);
  // if `n` < 5 reject `n` , else resolve `n`
  return Promise[n < 5 ? "reject" : "resolve"](n)
    .then(function(value) {
      return value
        // here I choose if I want to resolve or reject.
    })
    .catch(function(err) {
      return Promise.reject(["rejected", err])
    });
}

(function repeat() {
  var promise = Promise.resolve(foo());

  return promise
    .then(function(data) {
      console.log("complete", data)
        // I know here what I have to return.
    })
    .catch(function(err) {
        // I want to repeat the foo function until it is resolved and not rejected. 
      console.log(err);
      if (err[0] === "rejected") repeat()
    })
}())

【讨论】:

  • 你能解释得更好吗?解决和拒绝句柄在哪里?
  • @BrunoBruzzano “解决和拒绝句柄在哪里?” ?在foo。如果 promise 在 foo 处被拒绝,则递归调用 repeat 直到 foo 返回已解决的 promise 值
  • @BrunoBruzzano 查看更新后的帖子,包括 stacksn-ps 以演示方法
  • 谢谢@guest271314,即使我有疑问,我也会尽快尝试。所有这些东西都在一个必须返回一个承诺的 obj 的函数中——让我们称之为“myPromisedObject”。它已经存在,因此无需创建。我必须在哪里退货?我的意思是,立即函数应该返回一些东西?
  • 谢谢@guest271314,我用你的解决方案解决了。
猜你喜欢
  • 2021-01-25
  • 2021-08-19
  • 2018-07-21
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2015-01-03
  • 2014-04-21
  • 2021-05-12
相关资源
最近更新 更多