如何使用jQuery Deferred(何时/然后等)来修复末日问题的异步金字塔
How to use jQuery Deferred (when/then, etc.) to fix asynchroneous pyramid of doom issue
我一直在困惑一段时间,试图围绕JavaScript的承诺。我想修复代码中异步调用的一些问题,以取消 spagethise。但我希望有一位专家来帮助我,因为我已经浪费了相当多的时间。
我想使用它的jQuery Deferreds,因为我已经在项目中使用了jQuery(v1.11(,并且我不想添加更多的库(已经有超过5个(。我读到jQuery并不完全遵循Promises/A规范,但我认为它对于我的用例来说已经足够了。我稍后会看 q.js 或其他库。
我试图创建一个简单的示例,我已经熟悉JavaScript的异步行为,如这个SO问题所示:设置超时延迟不起作用
我创建了一个JS小提琴来解决该用户的问题,但使用了"厄运金字塔"结构:http://jsfiddle.net/bartvanderwal/31p0w02b/
现在我想要一个很好的简单示例,说明如何使用 Promise 和使用 then(( 或其他东西链接方法调用来展平这个金字塔:
$.when(takeStep())
.then(takeStep())
.then(takeStep())
.then(takeStep())..
但是我无法让它工作。到目前为止,我的尝试是在这个小提琴中:http://jsfiddle.net/bartvanderwal/vhwnj6dh/
编辑20:58:这是现在工作的小提琴,这要归功于(主要(@Bergi:http://jsfiddle.net/bartvanderwal/h2gccsds/
但我无法让它工作
几点:
- 不要使用
deferreds
数组,更不要使用全局数组!将其分解为单个步骤,并对每个步骤使用单个承诺。 - 使用计数器值解析承诺。承诺应始终表示(异步(结果。
- 不要使用
$.when
,除非你需要等待多个承诺 -
then
确实采用回调函数。你不能叫takeStep()
,而是通过它。
您可能还想看看这个答案的经验法则,以熟悉承诺。
// 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() + ')');
});
相关文章:
- 在指令控制器中使用$attrs时出现问题
- 将PHP变量传递给jQuery时遇到问题
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 参数变量出现ngTable指令问题
- 剑道网格jQuery动画()问题
- 我的jQuery插件参数没有正确启动,遇到了问题
- Phonegap-(安卓/iphone)多个图像的图像库出现问题
- TableExport jquery插件:文件名和扩展名问题
- JavaScript Pub/Sub属性访问问题
- JavaScript异步问题
- 如何解决Yii中的页面刷新问题
- Safari(Mac OS)上的jQuery平滑滚动问题
- jqGrid树网格问题
- 使用正则表达式评估电子邮件地址时出现性能问题
- 如何消除代码中的未定义和其他问题
- JavaScript代码问题:我正在将对象转换为数组
- 三星智能电视应用程序;Brightcove示例应用程序远程控制问题
- 由于iframe导致的问题
- ReactJS和SpringDataRest缓存问题可能与websocket有关
- 如何使用jQuery Deferred(何时/然后等)来修复末日问题的异步金字塔