4
setTimeout ->
  console.log 'foo'
  setTimeout ->
    console.log 'bar'
    setTimeout ->
      console.log 'baz'
    , 1000
  , 1000
, 1000

是否可以使用 jQuery.Deferred 实现相同的结果?可能类似于以下内容:

someFunction()
.then(-> console.log 'foo')
.then(delay 1000)
.then(-> console.log 'bar')
.then(delay 1000)
.then(-> console.log 'baz')

也许我认为 promise 让编写变得容易是错误的:做 A,然后一旦完成,做 B,然后一旦完成,做C。

4

2 回答 2

8

您可以.then()通过返回一个 Deferred对象来链接调用。特别是为了延迟,你可以使用类似的东西:

function someFunction() {
    var ret = new $.Deferred();
    // setTimeout just to simulate `someFunction` taking 1000ms to complete its deferred
    setTimeout(function () {
        ret.resolve();
    }, 1000);
    return ret;
}

function logger(str) {
    return function () {
        console.log("Logger:", str);
    };
}

function delay(time) {
    return function () {
        console.log("Delaying");
        var ret = new $.Deferred();
        setTimeout(function () {
            ret.resolve();
        }, time);
        return ret;
    };
}

someFunction()
    .then(logger("foo"))
    .then(delay(3000))
    .then(logger("bar"))
    .then(delay(3000))
    .then(logger("baz"));

演示:http: //jsfiddle.net/yGcfu/

于 2013-08-01T00:55:34.693 回答
1

是的:

delay = (ms) -> ->
    d = $.Deferred()
    setTimeout d.resolve, ms
    d.promise()

在 jsfiddle.net 上的演示

或者,更常见的delay方法是省略闭包(一个->)并使用

….then(-> delay 1000) …
于 2013-08-01T00:54:28.460 回答