【发布时间】:2016-07-09 09:29:35
【问题描述】:
尽管这里有很多关于该主题的答案,但我仍然不太了解$.Deferred() 对象。
我想更好地理解它们并避免任何“反模式”。
我已阅读:
https://api.jquery.com/category/deferred-object/
而“坚持”的是它是一个对象,它具有可用的方法,例如done()。
我尝试根据this answer 创建最简单的示例:
function function1() {
// create a deferred object first
var dfrd1 = $.Deferred();
// mimic an async request
setTimeout(function() {
// lots of async stuff here
// resolve the deferred object
dfrd1.resolve();
}, 1000);
// return a promise()
return dfrd1.promise();
}
function1().done(function() {
// when function1 is done, do something
console.log('function1 is done!');
});
这似乎有四个组成部分:
- 创建一个
$.Deferred()对象。 -
resolve()在异步代码块之后。 - 在异步代码块之后返回
promise()。 - 调用
done()方法。
上面的示例似乎按预期工作,但是当我尝试将此逻辑应用于包含 $.ajax() 请求的大型函数时,以便在加载后将类应用于内容时,该类不是应用。
我可以通过 firebug 运行 addClass() 代码,因此该代码没有任何问题。
大函数场景的伪代码为:
function largeFunction(myVar) {
// create a deferred object first
var dfrd1 = $.Deferred();
// lots of code and an ajax request here
// resolve the object and return a promise
// (this seems naive to hope resolve will
// know when everything above has completed)
dfrd1.resolve();
return dfrd1.promise();
}
// call the done() method from an on click event
$(document).on("click", ".some_class", function() {
largeFunction(myVar).done(function() {
console.log('largeFunction(myVar) is done, you can now add class');
var my_classes = $(".my_class");
$.each(classes, function(index, value) {
$(this).addClass("another_class");
});
});
});
以下是对$.Deferred() 问题的良好、简短、简单的回答,我理解其逻辑,但似乎不适用于我的场景(例如,我不能只链接promise()经过简单的fadeOut()):
https://stackoverflow.com/a/24234881/1063287
问题
在上面的大型函数示例中,我需要遵循哪些约定才能在 ajax 请求等执行完毕后调用done()?
【问题讨论】:
-
简单 - 在 ajax 调用的
.then方法中解析dfd(或返回ajax调用本身)。 -
@Adam 或者您可以从
$.ajax调用本身返回承诺。无论哪种方式,您都应该将其添加为答案