蓝鸟的Promise.settle不能用正确的值解决

我有以下代码:

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 =从string中提取的图像链接数组
  • imgur = https://github.com/kaimallea/node-imgur

预期的行为是.map的结果是在原始数组中的图像被上传到imgur(或'#',在上传失败的情况下由于任何原因)之后,用imgur链接数组解决的承诺。

相反,Promise.settle 立即解决(即似乎不等待imgur上传),而inspection.value()是来自matches数组的原始图像url(当尝试读取数据时会产生错误) .data.link一个string的.data.link属性)。

为什么会发生? 为什么不能上传到imgur并正确parsing?

当我看着Promise.settle()的Bluebird源代码时 ,我只看到它处理第一个参数(期待一个promise数组)。 我一直使用它作为Promise.all()的替代品,当你想完成所有的承诺,即使有一些错误。

我不知道.settle()的Bluebird文档是否错误地将它作为第二个参数来处理第一个数组? 该代码有点难以遵循,但我不明白Promise.settle()曾经使用第二个参数(除非这是不正确的代码,因为某些原因)。

正如你所指出的,另一种select是:

 Promise.settle(matches.map(imgur.uploadUrl)).then(...) 

它只是将一组promise传递给.settle()


仅供参考,我通过创build一个简单的testing用例并在debugging器中进入Promise.settle()来validation,它从不使用传递给它的第二个参数。 这似乎是文档不符合实现的情况。 我希望有人计划实施有logging的内容,但从未完成实施。

这确实是文档中的一个错误。 它是固定的(道具为OP请求拉)。

文档现在显示.settle的正确用法。