jquery - 使用 jQuery.Deferred 避免嵌套 setTimeout 回调

标签 jquery coffeescript promise deferred

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

最佳答案

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

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/

关于jquery - 使用 jQuery.Deferred 避免嵌套 setTimeout 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17983331/

相关文章:

javascript - 如何使用 Bluebird 在构造函数构建的 "class"上 promise 导出的函数

javascript - jQuery - 使用类遍历所有元素并改变它们的样式

javascript - 带有数组的 javascript 类是静态的

javascript - 使用 JQuery 调整 Div 的大小以匹配窗口尺寸

javascript - "... is not a function"错误

JQuery HoverIntent 无法与 Webpack 和 ProvidePlugin 一起使用

javascript - reject() 和 return 不会终止执行

javascript - 异步/等待与 SubtleCrypto 结合使用

javascript - 替换同名类的内部 div 中的跨度文本

javascript - 选择表单中的所有元素,除了父 div 包含显示 :none