0

在我的项目中,我没有使用回调,而是尝试使用 $.Deferred 在所有应用程序中具有统一的逻辑,我的代码中有很多地方可以执行以下操作:

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);
}

在这段代码中,我个人不喜欢最后一行:

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

有没有标准的表达方式:

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

这基本上意味着:

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

编辑

我已经更深入地研究了这个问题,似乎只有当您不依赖没有内存的 deferred.progress() 时,以下解决方案才可以,因此在后续异步操作同步完成时不会返回任何数据。

概括

如果您使用 $.Deferred() 作为回调(即当您依赖notifyprogress函数时,在这种情况下您需要将其作为参数传递),那么您将不得不使用丑陋的

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

1 回答 1

2

你可以替换这个

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

有了这个:

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

并删除对变量的所有引用,deferred因为$.when已经为您创建了一个承诺(据我阅读手册)。

于 2013-04-01T19:04:41.757 回答