那么我们能获得当前的承诺吗?

时间:2016-08-04 03:37:31

标签: javascript loops recursion promise

我希望有一些机制可以重做然后在promise中运行。继续这样做,直到它通过一些检查

StoringPin

2 个答案:

答案 0 :(得分:3)

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

如果你想重复一些事情,你可以用你想要重复的东西来创建一个函数,然后从.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
});

答案 1 :(得分: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));

validationLength = 10;

$('#jkeyboard').on('keyup keydown change keypress', function () {
    if($(this).val().length > validationLength){

        val=$(this).val().substr(0,$(this).val().length-1);
        $(this).val(val);
    };
});

另见multiple, sequential fetch() Promise