蓝鸟的Promise.settle并没有用正确的值来解决

时间:2014-10-27 18:30:39

标签: javascript node.js promise bluebird

我有以下代码:

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 '#';
    })

其中

预期的行为是.map的结果是一个承诺,在原始数组中的图像上传到imgur(或'#',以防上传失败的情况下)后,使用一系列imgur链接解析任何原因)。

相反,Promise.settle立即解析 (即似乎不等待imgur上传),inspection.value()是来自{{1}的原始图片网址数组(在尝试读取字符串的matches属性时会出错)。

为什么会这样?为什么不上传到imgur并正确解析?

2 个答案:

答案 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的正确用法。