我正在使用async.js库来实现异步请求流 下面的代码工作正常。
async.each(
//--- Collection of models to save ---//
collSaveData,
function(model, callback){
model.save([], {success: function(){
callback();
}});
},
function(err){
console.log('finished');
});
我如何回复承诺?
我的意思是,像这样的方式:
var promise = async.each(
//--- Collection of models to save ---//
collSaveData,
function(model, callback){
model.save([], {success: function(){
callback();
}});
},
function(err){
console.log('finished');
});
答案 0 :(得分:1)
您可能不需要async.js来发出呼叫并同步它们。将Model.save
返回的对象与$.when
结合起来产生一般承诺:
var promises = _.invoke(collSaveData, 'save');
var promise = $.when.apply(null, promises);
promise.then(function() {
console.log('all done');
});
小提琴http://jsfiddle.net/nikoshr/Z3Ezw/
您可以自定义处理每次保存的响应的方式,例如:
var promises = _.map(collSaveData, function(m) {
return m.save().then(function(response) {
console.log('saved', m);
});
});
关键是为每个模型返回一个承诺。 http://jsfiddle.net/nikoshr/Z3Ezw/2/
答案 1 :(得分:1)
之前没有实际使用async但是查看文档它没有引用返回一个promise所以你必须用一个确实返回一个promise的函数包装asyn.each然后成功/错误回调就可以解决或拒绝承诺
这是一个应该有效的快速示例
//wrap the async each and return a promise from this call
var promiseAsync = function(openfiles, saveFile) {
var defer = $.Deferred();
async.each(
openfiles, saveFile, function(err) {
if (err) {
defer.reject(err);
} else {
defer.resolve();
}
});
return defer.promise();
}
//now it can be used like a normal promise
var promise = promiseAsync(collSaveData, function(model, callback) {
model.save([], {
success: function() {
callback();
}
});
});
$.when(promise).done(function(){
//whatever
}).fail(function(err){
//error
});
在整个应用程序中使用promiseAsync(将其附加到Backbone某处,下划线mixin,帮助/实用程序模块??)然后您可以随时使用它。
更新:基于@ nikoshr的小提琴(用于设置页面)的小提琴(现在开始使用代码笔上的小提琴,就像你可以在浏览器中使用控制台一样){{3 }}