javascript - 如何使用 jQuery Deferred(何时/那么等)来修复异步金字塔问题

标签 javascript jquery promise settimeout jquery-deferred

我已经困惑了很长一段时间,试图理解 JavaScript 的 promise 。我想修复代码中异步调用的一些问题,以消除它。但我希望有专家来帮助我,因为我已经浪费了相当多的时间。

我想使用jQuery Deferreds,因为我已经在我的项目中使用了 jQuery (v1.11),并且我不想添加任何更多的库(已经有超过5)。我读到 jQuery 并不完全遵循 Promises/A 规范,但我认为它对于我的用例来说已经足够好了。稍后我会查看 q.js 或其他库。

我试图创建一个简单的示例,并且我已经熟悉 JavaScript 的异步行为,如以下问题所示: setTimeout delay not working

我创建了一个 JS fiddle 来解决该用户的问题,但使用了“末日金字塔”结构: http://jsfiddle.net/bartvanderwal/31p0w02b/

现在我想要一个很好的简单示例,说明如何使用 Promises 展平这个金字塔,并使用 then() 或其他方法调用链接方法:

$.when(takeStep())
  .then(takeStep())
  .then(takeStep())
  .then(takeStep())..

但是我无法让它工作。到目前为止我的尝试是在这个 fiddle 中: http://jsfiddle.net/bartvanderwal/vhwnj6dh/


编辑 20:58:这是现在工作的 fiddle ,感谢(主要)@Bergi: http://jsfiddle.net/bartvanderwal/h2gccsds/

最佳答案

But I can't get it to work

几点:

  • 不要使用一组deferreds,更不要使用全局数组!将其分解为多个步骤,并为每个步骤使用一个 Promise。
  • 使用计数器值来解决 promise 。 promise 应该始终代表(异步)结果。
  • 不要使用 $.when 除非你需要等待多个 Promise
  • then 确实采用回调函数。您不得调用 takeStep(),而应传递它。

您可能还想看看this answer熟悉 Promise 的经验法则。

// the most generic function that only waits and returns a promise
function wait(t, v) {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve(v);
    }, t);
    return d.promise();
}

// logs the value and returns the next number
function markStep(nr) {
    log('step ' + cntr + ': ' + getCurrentTime() );
    return nr+1;
}
// waits before logging and returns a promise for the next number
function takeStep(nr) {
    return wait(stepTime, nr).then(markStep);
}

takeStep(0)
.then(takeStep)
.then(takeStep)
.then(takeStep)
.then(takeStep)
.done(function(nr) {
    log('done (' + getCurrentTime() + ')');
});

关于javascript - 如何使用 jQuery Deferred(何时/那么等)来修复异步金字塔问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299411/

相关文章:

javascript - 使用javascript在html中查找文本并返回以下字符串

javascript - 为什么我的 parseInt 函数没有将我的字符串转换为整数?

jquery - 使用 Rails 4 和 JQuery 添加\删除嵌套表单中的项目

javascript - 在定义该函数期间评估 jQuery 函数变量值

javascript - 如何通过jQuery的点击函数获取用户输入

javascript - 一旦在 node.js Web 服务器上生成图像(使用 express),显示图像的最简单方法是什么?

javascript - 切换 css 类以显示/ overflow hidden 不会重新显示内容

javascript - 如何使用基于 promise 的 node.js 编码区分编程错误和操作错误?

javascript - 如何在 Javascript 中的 forEach 循环内正确链接 Promise

javascript - 处理 promise 错误的最佳方法是什么?