首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当数组已被处理时,我如何退出承诺序列?

当数组已被处理时,我如何退出承诺序列?
EN

Stack Overflow用户
提问于 2016-03-23 19:23:04
回答 1查看 345关注 0票数 0

我在一个脚本中实现了下面的代码示例,该脚本遍历一个结果数组,并为每个结果发出一个http请求。

代码语言:javascript
复制
function sequence(array, callback) {
    return array.reduce(function chain(promise, item) {
        return promise.then(function () {
            return callback(item);
        });
    }, Promise.resolve());
};

var products = ['sku-1', 'sku-2', 'sku-3'];

sequence(products, function (sku) {
    return getInfo(sku).then(function (info) {
        console.log(info)
    });
}).catch(function (reason) {
    console.log(reason);
});

function getInfo(sku) {
    console.log('Requested info for ' + sku);
    //assume this function makes an http request and returns a  promise
}

处理完数组中的所有项后,脚本不会退出。我将如何调整它,以使这种情况发生?

我的实现进行了一个API调用并返回了一个承诺:

代码语言:javascript
复制
....

}).then(function(results){
sequence(results, function(result){

    checkSpam(result).then(function(akismet){
        if(akismet) {
            //console.log('spam returned from checkspam');
            write_spam_to_file(result);
        } else {

            //console.log('no spam returned from checkspam');
        }
    })
});

}).catch(function (e) {
    console.log('Error occurred:');
    console.log(e);
});


function sequence(array, callback) {
    return array.reduce(function chain(promise, item) {
        return promise.then(function () {
            return callback(item);
        });
    }, Promise.resolve());
}

function checkSpam(entry) {

    var akismetPromise = new Promise(function resolver(resolve, reject) {
        akismet.checkSpam({
            user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1',
            referrer: 'http://google.com',
            user_ip: entry.ip,
            comment_author: entry.poster,
            comment_content: entry.message,
            comment_type: 'forum-post'


        }, function (err, spam) {
            if (err) reject(err);
            resolve(spam);
        });

    });
    return akismetPromise;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-23 20:15:02

与第一个代码片段不同的是,实际代码缺少大量的return关键字:

代码语言:javascript
复制
    …
}).then(function(results) {
    return sequence(results, function(result) {
//  ^^^^^^
        return checkSpam(result).then(function(akismet) {
//      ^^^^^^
            if (akismet) {
                return write_spam_to_file(result);
//              ^^^^^^ // assuming the write is asynchronous and returns a promise?
            }
        });
    });
}) …

如果没有来自异步函数的always return a promise (包括then回调),承诺链就不知道等待什么,并且不等待任何结果就执行下一个回调。

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

https://stackoverflow.com/questions/36186967

复制
相关文章

相似问题

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