延迟语句(如 promise() 和 done())如何工作
How do deferred statements, such as promise() and done(), work?
我需要帮助理解延迟方法(如promise()
和done()
(的使用。
1st( 在此示例中,.promise()
被添加到 animate 中,其中 done()
被调用。
var stack = new Array();
$(document).ready(function() {
$(".droppable").each(function(){
stack.push(new Droppable($(this)));
});
dropNext();
});
function dropNext(){
var droppable = stack.pop();
if(droppable){
droppable.drop().done(dropNext);
}
}
function Droppable(domElem) {
function drop() {
return domElem.animate(
{
opacity : "1"
}
).promise();
}
this.drop = drop;
}
应许的目的是什么?它是如何工作的?
2nd( jQuery 文档用 $.get 给出了这种示例,但不知道它与使用已经随 $.get()
提供的匿名函数回调有何不同:
$.get("test.php", {},
function (result) {
alert(result);
}
);
$.get( "test.php" ).done(
function(result) {
alert(result);
}
);
匿名函数不是已经是一个回调,用于返回从服务器返回时要解析的结果吗?
promise 是一种跟踪延迟结果以使异步操作看起来像同步操作的方法。在您给出的链中只有一个链接的示例中,回调也同样有效。真正的力量在于多个环节,并允许错误冒泡到顶层进行处理。
对于第一个示例,animate
需要一些时间,因此返回一个在动画完成后解析的promise
可以确保在下一个动画开始之前完成上一个动画。它说:">我告诉你现在该做什么,但在另一件事完成之前不要这样做。如果您在此处的列表stack
有 5 个元素,您可以遍历并将它们与上面的代码链接在一起。要使用回调来做到这一点,您需要将回调嵌套在 5 层深度。
承诺的实质是then
,允许多个操作链接在一起。查看$.get
示例,假设您要执行多个相互依赖的 API 调用:
$.get("test.php", {},
function (result) {
$.post("test-details.php", {data: result}, function(detail) {
$.get("test-content.php", {id: detail.id}, function(content) {
// do content stuff
// whoa, this is getting deep
});
});
}
);
您可以使用承诺将其扁平化。
$.get( "test.php" ).then(function(result) {
return $.post("test-details.php", {data: result});
}).then(function(detail) {
return $.get("test-content.php", {id: detail.id});
}).then(function(content) {
// do content stuff
});
您可以通过让 go 到链的末端来捕获沿途发生的任何错误。
为了进一步阅读,我建议你错过了承诺和[承诺反模式 https://github.com/petkaantonov/bluebird/wiki/Promise 反模式((来自蓝鸟。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- 在JavaScript中的类中,push和concat的工作方式有何不同