【问题标题】:Can we get current promise in then?我们能在那时得到目前的承诺吗?
【发布时间】:2016-12-10 00:44:22
【问题描述】:

我想有一些机制来重做,然后在承诺中发挥作用。继续这样做直到它通过一些检查

somePromise.then(() => {
    if(state == "finish")
        return;

    // DoSomething async then repeat these codes
    // could we do it by [return this;] ?
}).then(() => console.log("finish"));

【问题讨论】:

  • var retry = fn => _ => fn().catch(retry(fn)); - 如果检查失败则抛出 fn ... 用法:retry(fn).then(ok => console.log(ok));
  • 等一下,如果满足第一个 .then 中的某些条件,您是否要重新运行 somePromise.then(() => {

标签: javascript loops recursion promise


【解决方案1】:

您可以将使用的函数命名为.then(),递归调用.then() 的同一函数,直到doSomethingAsync() 调用,直到state == "finish"

// name function used at `.then()` 
somePromise.then(function re(data) {
    if(state == "finish") {
        return data;
    };
    // DoSomething async then repeat these codes
    // call `re` at `.then()` chained to `doSomethingAsync()`
    doSomethinAsync(data).then(re);
}).then((data) => console.log("finish", data));

另见multiple, sequential fetch() Promise

【讨论】:

  • 谢谢。我使用 lambda 作为回调太多了,直到我忘记了我们可以命名回调。这很整洁
【解决方案2】:

通常,您无法访问 .then() 处理程序中的当前承诺。而且,在大多数情况下,你无论如何也做不了任何有用的事情。添加另一个 .then() 处理程序与您已经在其中的 .then() 处理程序没有任何不同。一旦实现,承诺永远不会改变它们的状态。

如果你想重复某件事,你可以从你想重复的事情中创建一个函数,然后从 .then() 处理程序中再次调用它,然后返回结果承诺(因此将它链接到前一个承诺) .

这是一个例子:

// utility delay function that returns a promise
function delay(t, val) {
   return new Promise(function(resolve) {
       setTimeout(function() {
           resolve(val);
       }, t);
   });
}

// repeatedly call someAsyncOp() until we see the operation is finished
function repeatUntil(t) {
   return someAsyncOp().then(function(state) {
      if (state !== "finish") {
           return delay(t).then(repeatUntil);
      }
   });
} 

// sample usage
repeatUntil(5000).then(function() {
    // state is finished here
}).catch(function(err) {
    // error here
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多