如果在此之前完成承诺,会发生什么?

时间:2015-08-17 20:55:12

标签: javascript promise

我们说我有 //here jsonString is your json in string format JSONObject obj3=new JSONObject(jsonString); JSONObject obj4=null; //Getting all the keys inside json object with keys- from and to Iterator<String> keys= obj3.keys(); while (keys.hasNext()) { String keyValue = (String)keys.next(); obj4 = obj3.getJSONObject(keyValue); //getting string values with keys- from and to String from = obj4.getString("from"); String to = obj4.getString("to"); int hourstart = Integer.parseInt(from); int hoursclose = Integer.parseInt(to); System.out.println("From : "+ hourstart +" To : "+ hoursclose); } 这样的话:

Promise

如果var promise = new Promise(function(resolve, reject) { // Do some async thing }); promise.then(function(response) { // Then do some other stuff }); async在致电Promise之前完成,会怎样?通常情况下,我只在.then()函数中执行长时间运行的任务,但是如果它真的很快完成一次会怎么样?

4 个答案:

答案 0 :(得分:25)

正如预期的那样:如果在promise已经解决之后调用,那么在这种情况下将立即调用回调。

很容易测试:

var promise = new Promise(function(resolve, reject) {
    resolve(123);
});

setTimeout(function() {
  promise.then(function(response) {
      alert(response);
  });
}, 1000)

答案 1 :(得分:12)

正如其他人已经指出的那样,您可以在解析承诺之前或之后添加.then回调,甚至可以添加多个回调。

这些回调将按照添加顺序调用,但总是异步,当前转向事件循环之后。因此,如果在添加.then时已经解决了承诺,则会立即调用您的处理程序,但是在“ascynchronous意义上”。

Promises/A+ spec说:

  

[...] onFulfilledonRejected异步执行,在调用then的事件循环之后,以及新堆栈。

答案 2 :(得分:5)

承诺具有状态,这意味着即使在承诺得到履行之后,您也可以使用.then向其附加回调,并且将调用它们,其结果与承诺在履行之后履行相同连接。

实现成功承诺的最终状态。这意味着您可以使用promise作为原始响应的缓存,为将来履行的承诺附加更多处理程序。

.then() on MDN

  

然后()

     

只要这个承诺是,就会调用其中一个提供的函数   履行或拒绝。返回一个新的承诺,其状态发生变化   取决于此承诺和提供的回调函数。

     

此方法返回后始终会调用相应的回调,   即使这个承诺已经履行或被拒绝。你也可以   在同一个promise上多次调用then方法,并且   回调将按照注册顺序调用。

答案 3 :(得分:2)

在承诺为then之前永远不会调用resolved回调,这就是我认为你完全意味着的意思。但是,如果在从函数返回之前解析了promise,那么在该时刻之后链接的任何其他成功回调仍将被执行。例如,

function getMeAResolvedPromise() {
    var prom = new Promise();
    prom.resolve('some val');
    return prom;
}

...

getMeAResolvedPromise.then(function(result) {
    // this will still be executed
});