jQuery延迟承诺然后

时间:2015-11-12 15:24:38

标签: javascript jquery

JavaScript Promises的新手,并且很难掌握这个概念。我似乎终于明白了,但似乎无法让它发挥作用。

这是一个简单的尝试:

first = function(){
    var deferred = new $.Deferred();
    console.log("first running")
    return deferred.promise();
}

second = function(){
    console.log("second running..sigh..");
}

$(document).ready(function() {

    first().then(second);

});

第二个没有被召唤。

2 个答案:

答案 0 :(得分:5)

为了调用第二个函数,您需要解决从第一个函数返回的延迟函数:

first = function(){
    var deferred = new $.Deferred();
    console.log("first running");
    deferred.resolve();  // <----------resolve the deferred
    return deferred.promise();
}

你也可以用参数解决它,这样无论它解决了什么,都会作为参数传递给你的第二个函数。这是一个小提示,为解决方案添加了一点延迟,因此它模仿异步行为并解析实际数据:

http://jsfiddle.net/1k6tLev8/1/

答案 1 :(得分:1)

您可以将 Promise 视为将来处理的任务,并将结果返回到延迟对象后面的所有函数。

Promise可以有3 + 1个状态:

  1. 待处理(任务尚未处理)
  2. 已完成已解决(正确处理)
  3. 拒绝(已处理但失败)
  4. 已结算(表示该任务已处理完毕。)
  5. var doSomethingAsync = new Promise(function(resolve, reject) {
      window.setTimeout(function() {
        resolve('Hello World');
    
        // OR
        
        // reject('You Are Not Welcome')
      }, 5000);
    });
    
    doSomethingAsync.then(
      function(message) {
        console.log('After few seconds we can finally tell you:', message)
      },
      function(error) {
        console.log('After few seconds we can finally tell you that: ', error);
      }
    );

    正如您在上面的代码段中所看到的,承诺对象然后方法接受 TWO 参数(注意,如果可用,则有第三个参数称为通知进度),第一个参数是在fullfilment的情况下调用,第二个是在拒绝的情况下调用。

    承诺在待定时,不会调用任何回调!