蓝鸟Promise.map与嵌套承诺不“完成”

时间:2015-09-16 14:51:42

标签: javascript node.js promise bluebird

我仍在努力找出蓝鸟中正确的承诺模式,而我在使用这种特殊结构时遇到了麻烦。

function mainFunction() {
    Promise.map(arrayValues, function(value) {

        return function1(value)
            .then(function(resp1) {
                return function2(resp1);
            })
            .then(function(resp2) {
                return function3 (resp2);
            })
    })
    .then(function(resp) {
        console.log(resp);
    })
    .catch(function(e) {
        throw e;
    });
}

我从来没有得到任何输出到最终的console.log(resp),这让我觉得我错误地回复了这个承诺。我在这里做错了什么?

编辑: 如果我添加

 .then(function(resp) {
     console.log(resp);
 })

对于function3的响应,打印就好了。但是,这个响应似乎永远不会从Map函数返回,并且没有任何catch块被绊倒..

编辑3:

我想我明白了。在我的代码中有一个混乱的解决/拒绝块,我没有完全思考,并没有正确地返回Promise,保持Promise.map挂起。

我想这是一个很好的地方,可以找出如何妥善处理这个问题。

我这里有这个代码向服务器发出http请求,而不是像多个URL一样解析HTML的主体:

Promise.map(arrayURLs, function(url) {
    function requestHTML(url) {
        console.log('HTTP GET : ' + url);

        return request.getAsync({
            'url': url
        })
        .then(function(html) {
            console.log('HTTP RESP: ' + url);
            return html[0].body;
        })
        .error(function() {
            return Promise.reject();
            console.log('HTTP Err: ' + url);
        });
    }
})

这背后的想法是我在这个返回的HTML主体上做了一些工作。但是,如果HTTP请求失败,没有大问题,我只想忽略它并让其余的HTTP请求通过。我想在这里停止传播错误,因为如果它获得一个空的html主体,其余的代码将会失败,并且这里很容易处理这个错误。

优雅处理null返回体的最佳方法是什么,以便Promise.map仍能按预期工作?

0 个答案:

没有答案