蓝鸟的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
的正确用法。