Използвайте отложени изрази с функции на 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