在我的项目中,我没有使用回调,而是尝试使用 $.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() 作为回调(即当您依赖notify
或progress
函数时,在这种情况下您需要将其作为参数传递),那么您将不得不使用丑陋的
blahblahblah.then(deferred.resolve, deferred.reject, deferred.notify)