【问题标题】:Use deferred statements with javascript functions使用带有 javascript 函数的延迟语句
【发布时间】:2014-12-09 23:34:58
【问题描述】:

我正在尝试理解 jQuery 延迟语句。在这种情况下,我想在 javascript 函数完成时使用延迟语句。

例如,当关卡对象完成加载后,做点什么……

但我无法将 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插件......但我不想这样做。

【问题讨论】:

  • 如果你有一个异步函数,你应该让它返回一个承诺。如果你不这样做,你不需要做任何事情。

标签: javascript jquery jquery-deferred


【解决方案1】:

要使用jQuery deferreds 或promise 的.then().done() 方法,你的函数必须返回一个promise。拥有这些方法的是 Promise。

所以,如果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
});

要理解的重要一点是,promise 没有魔法。 .then().done() 方法是 promise 对象上的方法。所以,如果你想在函数调用中使用它们,那么该函数必须返回一个 promise 对象,并且当底层函数完成时,该 promise 对象必须被解析或拒绝。对于客户端 jQuery 中的大多数情况,您不必创建自己的 Promise 或手动解析或拒绝它,因为您可以使用 jQuery 在执行异步操作时已经创建的 Promise。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多