Используйте отложенные операторы с функциями javascript

Я пытаюсь понять отложенные операторы 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... но я бы предпочел этого не делать.


person Growler    schedule 09.12.2014    source источник
comment
Если у вас есть асинхронная функция, вы должны заставить ее возвращать обещание. Если вы этого не сделаете, вам не нужно ничего делать.   -  person SLaks    schedule 10.12.2014


Ответы (1)


Чтобы использовать методы .then() или .done() отложенных или промисов jQuery, ваша функция должна возвращать промис. Это обещание, которое имеет эти методы.

Итак, если loadLevelObjects() возвращает обещание, вы можете сделать:

loadLevelObjects().done(function() {...})

Если loadLevelObjects() не асинхронный, то нет необходимости использовать .done(), так как вы можете просто писать код последовательно:

loadLevelObjects();
// next line of code here
doSomethingElse();

Асинхронные функции (в основном ajax в Javascript на стороне клиента) уже возвращают обещание в jQuery, поэтому вы можете напрямую использовать это обещание, не создавая свои собственные:

$.ajax(...).done(function() {...});

Или, если вызов ajax находится внутри функции, вы можете вернуть обещание из функции:

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() являются методами объекта обещания. Таким образом, если вы хотите использовать их в вызове функции, эта функция ДОЛЖНА возвращать объект-обещание, и этот объект-обещание должен быть разрешен или отклонен, когда базовая функция выполнена. В большинстве случаев в jQuery на стороне клиента вам не нужно создавать собственное обещание или вручную разрешать или отклонять его, поскольку вы можете просто использовать обещания, которые jQuery уже создает всякий раз, когда он выполняет асинхронную операцию.

person jfriend00    schedule 10.12.2014