使用带有javascript函数的延迟语句

时间:2014-12-09 23:34:59

标签: javascript jquery jquery-deferred

我正在尝试理解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插件......但我不想这样做。

1 个答案:

答案 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在执行异步操作时已经创建的承诺。