V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
chengliqiang0323
V2EX  ›  JavaScript

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

  •  
  •   chengliqiang0323 · 2015-01-14 17:26:41 +08:00 · 2343 次点击
    这是一个创建于 3394 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 条回复    2015-01-24 00:00:58 +08:00
    SoloCompany
        1
    SoloCompany  
       2015-01-14 22:07:29 +08:00 via Android   ❤️ 1
    done 的意思就是要求必须在状态转变为成功(resolved触发)才触发,你是怎么理解的啊。。。。
    chengliqiang0323
        2
    chengliqiang0323  
    OP
       2015-01-15 10:24:28 +08:00
    @SoloCompany 这是我想的顺序执行:在tasks函数里面有把状态转为成功,我觉得执行到$.when(wait(dtd))是wait函数执行这个时候会alert("执行完毕")而后alert("哈哈,成功了!");然后执行到dtd.resolve(),alert("哈哈,成功了!");
    leonlu
        3
    leonlu  
       2015-01-24 00:00:58 +08:00   ❤️ 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("出错啦!"); });

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4994 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 09:30 · PVG 17:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.