我已经困惑了很长一段时间,试图理解 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/