简体   繁体   中英

Conditional promises

In my script, I need to retrieve a dictionary to convert encoded values into names:

$.ajax({
    // retrieve dictionary
})
.done(function(dictionary){
    // convert encoded values into names
})
.done(function(){
    // run my application
});

However, sometimes the dictionary has already been loaded by another application, and in this case I don't need the ajax call:

if (dictionary) {
    // convert encoded values into names
    // run my application
}
else {
$.ajax({
    // retrieve dictionary
})
.done(function(dictionary){
    // convert encoded values into names
})
.done(function(){
    // run my application
});
}

This if/else statement is rather heavy, is there a way to make it shorter:

// load dictionary if needed
// then run my application

Note: I used the $ sign for my pseudo-code, but I am not necessarily tied to jQuery.

This is the pattern I generally use:

var done = function() {
    //continue loading application
}

if(!dictionary) {
    $.ajax({

    })
        .done(done);
} else {
    done.apply(this);
}

A very similar pattern, that always makes use of a deferred object, could be the following:

var 
    dictionaryDeferred = new $.Deferred(),
    dictionaryPromise = dictionaryDeferred.promise();

if(!dictionary) {
    $.ajax({

    })
        .done(function() {
            //do something with the response
            dictionaryDeferred.resolve();
        });
} else {
    dictionaryDeferred.resolve();
}

dictionaryPromise.then(function() {
    //continue loading application
});

You should call $.ajax() exactly once, and store the returned promise in your (global-ish) dictionary variable.

Then, every time you want to use the result, just write dictionary.then(...) .
If the AJAX request already finished, the callback will run immediately.

Maybe create a bogus promise with $.when?

var promise;
if (dictionary) promise = $.when(dictionary);
else {
    promise = $.ajax({

    })
    .done(function(dictionary){
        // convert encoded values into names
    });
}

promise
    .done(function(){
        // run my application
    });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM