我正在尝试理解jQuery延迟语句。在这种情况下,我想在javascript函数完成时使用deferred语句。
例如,当关卡对象完成加载时,请执行某些操作......
但是我无法将done()
附加到javascript函数:
loadLevelObjects(game.data.levelObjects).done(function () {
//do something
});
或者这种方法,可能使用deferred()
:
var dfd = $.Deferred();
loadLevelObjects(game.data.levelObjects).then do dfd.resolve();
dfd.done(function () {
//do something
});
如何将jQuery与javascript函数混合使用?我想有一种方法可以将loadLevelObjects()
重写为jQuery插件......但我不想这样做。
答案 0 :(得分:0)
要使用jQuery延迟或承诺的.then()
或.done()
方法,您的函数必须返回一个承诺。这是拥有这些方法的承诺。
因此,如果loadLevelObjects()
返回一个承诺,那么你可以这样做:
loadLevelObjects().done(function() {...})
如果loadLevelObjects()
不是异步的,那么就不需要使用.done()
,因为您可以按顺序编写代码:
loadLevelObjects();
// next line of code here
doSomethingElse();
异步函数(主要是客户端Javascript中的ajax)已经在jQuery中返回一个promise,因此您可以直接使用该promise而无需创建自己的:
$.ajax(...).done(function() {...});
或者,如果ajax调用在函数内部,则可以从函数返回promise:
function loadLevelObjects(arg1, arg2) {
// do some processing of arguments here
return $.ajax(...)
}
loadLevelObjects(...).done(function(result) {
// code here when loadLevelObjects async ajax call is done
});
重要的是要明白,承诺没有魔力。 .then()
和.done()
方法是promise对象上的方法。因此,如果要在函数调用中使用它们,那么该函数必须返回一个promise对象,并且在底层函数完成时必须解析或拒绝该promise对象。对于客户端jQuery中的大多数情况,您不必创建自己的承诺或手动解析或拒绝它,因为您可以使用jQuery在执行异步操作时已经创建的承诺。