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

2015-01-14 17:26:41 +08:00
 chengliqiang0323

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();
这段代码是怎样的执行顺序啊,求解释!我想的是先弹出“执行完毕”而后“哈哈,成功了!”而后“执行完毕”而后“哈哈,成功了”但是执行结果是:先弹出“哈哈,成功了!”而后弹出“执行完毕”

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

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/162142

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX