我仍在努力找出蓝鸟中正确的承诺模式,而我在使用这种特殊结构时遇到了麻烦。
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
仍能按预期工作?