使用setTimeout创建jQuery Deferred对象

时间:2014-08-13 00:40:13

标签: javascript jquery deferred

我很难理解创建自己的Deferred对象的价值。

假设你有以下jQuery

    function doStuffFirst() {
        var dfd = $.Deferred();
        // do some stuff here
        setTimeout(function() {
           dfd.resolve();
        },1);
        return dfd.promise();
    }

    function doStuffAfter() {
       //do some other stuff
    }

    $.when(doStuffFirst()).done(doStuffAfter);

我实际上并不知道doStuffFirst()已经完成,只是等了一段时间才开始doStuffAfter()

为什么这比仅仅去

更好
   function doStuffFirst() {
       // do some stuff here
   }

   setTimeout(function() {
      //do some other stuff
   },1);

2 个答案:

答案 0 :(得分:1)

你知道它已经完成了;但它没有用,因为你没有异步执行你的任务。任务执行,然后几乎立即创建并触发延迟。但是,如果您更改为:

function doStuffFirst() {
    var dfd = $.Deferred();
    setTimeout(function() {
        // do some stuff HERE
        dfd.resolve();
    },1);
    return dfd.promise();
}

然后它变得有用,因为它将立即返回,但稍后解决(任务完成时)。虽然你只有一个异步任务,但是使用延迟与使用普通回调没有太大的不同(只是更复杂,更漂亮,而且依赖性是另一种方式:回调在中去,而承诺来了 out 调度任务的例程)。但是,如果您有更复杂的要求,例如要同时执行两个异步任务,但要等到两者完成,那么承诺就会更优越。

答案 1 :(得分:0)

使用setTimeout只需在给定时间后执行代码,而promises会在承诺任务完成后执行代码。在处理完成时间未知的事物(例如ajax请求)时使用Promises。在setTimeout中,您知道何时执行某些代码。