推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
chengliqiang0323

一个有关 js 的 deferred 对象的问题?

  •  
  •   chengliqiang0323 · Jan 14, 2015 · 3066 views
    This topic created in 4147 days ago, the information mentioned may be changed or developed.

    var dtd = $.Deferred(); // 新建一个 Deferred 对象
       var wait = function(dtd){
        var tasks = function(){
          alert("执行完毕!");
          dtd.resolve(); // 改变 Deferred 对象的执行状态
        };
        setTimeout(tasks,5000);
        return dtd;
      };
      $.when(wait(dtd))
      .done(function(){ alert("哈哈,成功了!"); })
      .fail(function(){ alert("出错啦!"); });
      dtd.resolve();
    这段代码是怎样的执行顺序啊,求解释!我想的是先弹出“执行完毕”而后“哈哈,成功了!”而后“执行完毕”而后“哈哈,成功了”但是执行结果是:先弹出“哈哈,成功了!”而后弹出“执行完毕”

    3 replies    2015-01-24 00:00:58 +08:00
    SoloCompany
        1
    SoloCompany  
       Jan 14, 2015 via Android   ❤️ 1
    done 的意思就是要求必须在状态转变为成功(resolved触发)才触发,你是怎么理解的啊。。。。
    chengliqiang0323
        2
    chengliqiang0323  
    OP
       Jan 15, 2015
    @SoloCompany 这是我想的顺序执行:在tasks函数里面有把状态转为成功,我觉得执行到$.when(wait(dtd))是wait函数执行这个时候会alert("执行完毕")而后alert("哈哈,成功了!");然后执行到dtd.resolve(),alert("哈哈,成功了!");
    leonlu
        3
    leonlu  
       Jan 24, 2015   ❤️ 1
    $.when接收的应该是Promise对象吧。

    ```js
    var doSomethingAsync = function(dtd){
    var dtd = $.Deferred();
    var tasks = function(){
      alert("执行完毕!");
      dtd.resolve(); // 改变 Deferred 对象的执行状态
     };
     setTimeout(tasks,5000);
     return dtd.promise();
    };


    $.when(doSomethingAsync())
    .done(function(){ alert("哈哈,成功了!"); })
     .fail(function(){ alert("出错啦!"); });

    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2813 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 12:50 · PVG 20:50 · LAX 05:50 · JFK 08:50
    ♥ Do have faith in what you're doing.