首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async.js退货承诺

Async.js退货承诺
EN

Stack Overflow用户
提问于 2014-07-18 09:31:00
回答 2查看 199关注 0票数 0

我正在使用async.js库来实现异步请求流。

下面的代码运行良好。

代码语言:javascript
复制
async.each( 
    //--- Collection of models to save ---// 
    collSaveData, 
    function(model, callback){ 
        model.save([], {success: function(){ 
            callback(); 
        }}); 
    }, 
    function(err){ 
        console.log('finished'); 
    }); 

我怎样才能兑现诺言呢?

我是说,就像这样:

代码语言:javascript
复制
var promise = async.each( 
    //--- Collection of models to save ---// 
    collSaveData, 
    function(model, callback){ 
        model.save([], {success: function(){ 
            callback(); 
        }}); 
    }, 
    function(err){ 
        console.log('finished'); 
    }); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-18 12:43:02

您可能不需要async.js来发出调用并同步它们。将Model.save返回的对象与$.when组合起来,生成一个通用的承诺:

代码语言:javascript
复制
var promises = _.invoke(collSaveData, 'save');
var promise = $.when.apply(null, promises);
promise.then(function() {
    console.log('all done');
});

和一个Fiddle http://jsfiddle.net/nikoshr/Z3Ezw/

您可以自定义如何处理来自每个保存的响应,例如:

代码语言:javascript
复制
var promises = _.map(collSaveData, function(m) {
    return m.save().then(function(response) {
        console.log('saved', m);
    });
});

关键是为每个模型返回一个承诺。http://jsfiddle.net/nikoshr/Z3Ezw/2/

票数 1
EN

Stack Overflow用户

发布于 2014-07-18 12:46:55

以前并没有实际使用异步,但在查看文档时,它没有提到返回承诺,因此您必须用一个函数包装asyn.each,该函数确实返回了一个承诺,然后成功/错误回调就可以解决或拒绝该承诺。

下面是一个应该有效的快速示例

代码语言:javascript
复制
//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的小提琴(用于设置页面)(开始在代码笔上使用小提琴,就像浏览器中可以有控制台一样)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24821663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档