0

我有一个功能。函数内部如下所示:

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

我希望我可以通过使用延迟来简单地做到这一点。我的尝试看起来像:

var do_it = doSomething;

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

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

但这行不通。我究竟做错了什么?

编辑:将变量重命名dodo_it. 这不是代码的问题。问题是 when do_itis没有被执行doSomethingdoSomething

4

4 回答 4

3

do 是 javascript 中的关键字,因此最好重命名变量。

var do_it = doSomething;

if (!isNewCustomer) {
    do_it = $.getJSON(..., function(result) {
        doSomethingElse();
    });
}
//          || << note me
$.when(do_it()).done(function() {
    cleanup();
});
于 2012-02-09T22:46:15.633 回答
1
var result;

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

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

请参阅上面的代码:您从未像 Gigi 指出的那样调用该函数。

于 2012-02-10T01:28:44.273 回答
0

看看这个 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();
}
于 2015-02-20T17:30:50.810 回答
-1

你需要一个明确的延迟。如果您传递 when() 一个不是 Deferred 的参数,则该函数会立即调用,这可能就是您得到意外结果的原因。

var deferred = $.Deferred();

if (isNewCustomer) {
    deferred.resolveWith(doSomething());
}
else {
    $.getJSON(...).
        done(function(result) {
            deferred.resolveWith(doSomethingElse(result));
        }).
        fail(function(...) {
            deferred.rejectWith(...);
        });
}

deferred.promise().always(function() { cleanup(); });
于 2012-02-10T18:57:53.500 回答