JQuery отложено: - PullRequest
       5

JQuery отложено:

0 голосов
/ 10 февраля 2012

У меня есть функция.Внутренняя часть функции выглядит следующим образом:

if (isNewCustomer) {
    doSomething();
    cleanup();
}
else {
    $.getJSON(..., function(result) {
        doSomethingElse();
        cleanup();
    });
}

Я надеялся, что смогу просто сделать это, используя deferred.Моя попытка выглядит так:

var do_it = doSomething;

if (!isNewCustomer) {
    do_it = $.getJSON(..., function(result) {
        doSomethingElse();
    });
}

$.when(do_it).done(function() {
    cleanup();
});

Но это не работает.Что я делаю не так?

РЕДАКТИРОВАТЬ: Переименование переменной do в do_it.Это не проблема с кодом.Проблема в том, что когда do_it равно doSomething, doSomething не выполняется.

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

do - это ключевое слово в javascript, поэтому лучше переименовать переменную.

var do_it = doSomething;

if (!isNewCustomer) {
    do_it = $.getJSON(..., function(result) {
        doSomethingElse();
    });
}
//          || << note me
$.when(do_it()).done(function() {
    cleanup();
});
1 голос
/ 10 февраля 2012
var result;

if (isNewCustomer) {
    result = doSomething();
} else {
    result = $.getJSON( ..., function( data ) {
        doSomethingElse( data );
    });
}

$.when( result ).done(function() {
    cleanup();
});

См. Код выше: вы никогда не вызывали функцию, как указал Гиги.

0 голосов
/ 20 февраля 2015

Проверьте это jsfiddle https://jsfiddle.net/timlint/tg7xqtha/

Использование Deferred это путь. Иногда сложно понять поток и способы передачи данных, но этот пример может дать вам некоторое представление.

Вы можете почти думать об отсрочке как о флаге. в функции вы создаете отложенный объект.

функция возвращает .promise () для этого отложенного. это позволяет вам вызывать функцию doSomething (bool) .done () и делать что-то после ее завершения. Вы решаете отложенное, когда знаете, что задача выполнена, и она не будет вызываться до тех пор.

function doSomething(isNewCustomer)
{

// think of a deferred as a flag object in a way
var d = $.Deferred();


if(!isNewCustomer)
{
    $.getJSON(..., function(result) {
        // work with data
    }).done(function() {
        // finisn up data

        // set deferred to resolved
        d.resolve();
    });
}
else
{
    // some business logic

    // set deferred to resolved
    d.resolve();   
}
// returning the promise lets you call .done()
// on this function call in the main call
return d.promise();
}
0 голосов
/ 10 февраля 2012

Вам нужен явный отсроченный.Если вы передаете когда () аргумент, который не является отложенным, функция вызывается немедленно, и, вероятно, поэтому вы получаете неожиданные результаты.

...