我有以下代码:
return Promise.settle(matches, imgur.uploadUrl)
.map(function (inspection) {
if (inspection.isFulfilled()) {
return inspection.value().data.link;
}
return '#';
})
上述更详细的版本显示了同样的问题:
return Promise.settle(matches, function(match) { return imgur.uploadUrl(match); })
.then(function(results) {
return results;
})
.map(function (inspection) {
if (inspection.isFulfilled()) {
return inspection.value().data.link;
}
return '#';
})
其中
Promise
=蓝鸟的承诺matches
=从字符串中提取的图像链接数组imgur
= https://github.com/kaimallea/node-imgur 预期的行为是.map
的结果是一个承诺,在原始数组中的图像上传到imgur(或'#',以防上传失败的情况下)后,使用一系列imgur链接解析任何原因)。
相反,Promise.settle立即解析 (即似乎不等待imgur上传),inspection.value()
是来自{{1}的原始图片网址数组(在尝试读取字符串的matches
属性时会出错)。
为什么会这样?为什么不上传到imgur并正确解析?
答案 0 :(得分:4)
当我查看Promise.settle()
Promise.all()
时,我只看到它处理第一个参数(期望一组promises)。当你想要完成所有承诺时,我总是将它用作.settle()
的替代品,即使有些人有错误。
我想知道Promise.settle()
的Bluebird文档是否错误,它将函数作为处理第一个数组的第二个参数?代码有点难以理解,但我不知道Promise.settle(matches.map(imgur.uploadUrl)).then(...)
如何使用第二个参数(除非这不是我正在考虑的正确代码) 。
正如您所指出的,另一种选择是:
.settle()
只是将一系列承诺传递给Promise.settle()
。
仅供参考,我通过创建一个简单的测试用例并在调试器中单步进入{{1}}来验证它从未使用传递给它的第二个参数。这似乎是文档与实现不匹配的情况。我希望有人计划实施所记录的内容,但从未完成该实现。
答案 1 :(得分:4)
这确实是文档中的一个错误。它被修复了(拉出请求的道具到OP)。
文档现在显示.settle
的正确用法。