Lu4
Lu4

Reputation: 15030

Using $.Deferred() as a callback

in my project I'm not using callbacks instead I'm trying to use $.Deferred to have uniform logic across all application, I have lots places in my code where I do something like the following:

function someMagicHandler(request) {
    var me = this;
    var sandbox = me.getSandbox();

    var options = request.options;
    var deferred = request.deferred;

    var result = [];

    var databaseOperation = sandbox.database.all('records').done(function (records) {
        result.concat(records);
        deferred.notify(records);
    });

    var serverResponse;
    var serverOperation = sandbox.server.requestRecords(options).then(function (response) {
        // First we are trying to save received records to database
        serverResponse = response;
        result.concat(response.Records);
        deferred.notify(response.Records);

        return sandbox.database.put('records', response.Records);
    }).done(function() {
        sandbox.storage.setTimestamp('records', new Date(serverResponse.Timestamp));
    });

    $.when(databaseOperation, serverOperation).then(deferred.resolve, deferred.reject);
}

In this code I'm personally don't like one of the last lines:

$.when(databaseOperation, serverOperation).then(deferred.resolve, deferred.reject);

Is there a standard way to express:

$.when(databaseOperation, serverOperation).then(deferred);

which would essentially mean:

$.when(databaseOperation, serverOperation).then(deferred.resolve, deferred.reject, deferred.notify);

Edit

I've investigated this problem deeper, and it seems that below solution is ok only when you are not relying on deferred.progress() which has no memory and therefore will not return any data in case when subsequent async operation is complete synchronously.

Summary

If you are using $.Deferred() as a callback (i.e. when you rely on notify or progress functions and in that case you need pass it as an argument) than you will be obligated to use the ugly

blahblahblah.then(deferred.resolve, deferred.reject, deferred.notify)

Upvotes: 0

Views: 133

Answers (1)

mzedeler
mzedeler

Reputation: 4381

You can just replace this

$.when(databaseOperation, serverOperation).then(deferred.resolve, deferred.reject);

with this:

request.deferred = $.when(databaseOperation, serverOperation);

And delete all references to the variable deferred because $.when already creates a promise for you with (as far as I read the manual).

Upvotes: 2

Related Questions