Async.js返回承诺

时间:2014-07-18 09:31:00

标签: javascript backbone.js asynchronous async.js

我正在使用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'); 
    }); 

2 个答案:

答案 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 }}