我正在使用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');
}); 发布于 2014-07-18 12:43:02
您可能不需要async.js来发出调用并同步它们。将Model.save返回的对象与$.when组合起来,生成一个通用的承诺:
var promises = _.invoke(collSaveData, 'save');
var promise = $.when.apply(null, promises);
promise.then(function() {
console.log('all done');
});和一个Fiddle 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/
发布于 2014-07-18 12:46:55
以前并没有实际使用异步,但在查看文档时,它没有提到返回承诺,因此您必须用一个函数包装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在整个应用程序中可用(将它附加到主干网某个地方,下划线混合,助手/实用模块?)然后你就可以随时使用它了。
Update:基于@nikoshr的小提琴(用于设置页面)(开始在代码笔上使用小提琴,就像浏览器中可以有控制台一样)
https://stackoverflow.com/questions/24821663
复制相似问题