Bluebird 的 Promise.settle 无法解析正确的值

Bluebird's Promise.settle doesn't resolve with the correct values

提问人:Madara's Ghost 提问时间:10/28/2014 最后编辑:Madara's Ghost 更新时间:10/28/2014 访问量:2685

问:

我有以下代码:

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,在原始数组中的图像上传到 imgur(或“#”,如果上传因任何原因失败)后,该 promise 会用 imgur 链接数组解析。.map

相反,Promise.settle 会立即解析(即似乎不等待 imgur 上传),并且是数组中的原始图像 url(在尝试读取字符串的属性时会出现错误)。inspection.value()matches.data.link

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

JavaScript 节点.js 承诺 蓝鸟

评论

0赞 jfriend00 10/28/2014
我建议先简化一下,看看是否包含你所期望的内容,这样你就可以看到它是没有做你想做的事还是.Promise.settle(matches, imgur.uploadUrl).then(function(results) { ... })results.settle().map()
0赞 Madara's Ghost 10/28/2014
实际上,在我得到这个确切版本的代码之前,我确实这样做了,它并没有太大的区别。
0赞 jfriend00 10/28/2014
我评论的重点是让您解释一下是否得到了正确的结果?是 还是 的问题。我试图将一个复杂的问题分解成几部分,以便人们知道在哪里进一步寻找这个问题。.settle().settle().map()
1赞 jfriend00 10/28/2014
当我查看 的 Bluebird 源代码时,我只看到它处理第一个参数(期望一个 promise 数组)。我想知道 Bluebird 文档是否错误地将函数作为将处理第一个数组的第二个参数?代码有点难以理解,但我看不出如何使用第二个参数(除非由于某种原因这不是我正在寻找的正确代码)。Promise.settle().settle()Promise.settle()
0赞 Madara's Ghost 10/28/2014
@jfriend00 将其作为答案发布。我重构了它,它起作用了。我会用蓝鸟提交一个错误Promise.settle(matches.map(imgur.uploadUrl))

答:

4赞 jfriend00 10/28/2014 #1

当我查看 的 Bluebird 源代码时,我只看到它处理第一个参数(期望一个 promise 数组)。我总是用它来代替你希望完成所有承诺时,即使有些承诺有错误。Promise.settle()Promise.all()

我想知道 Bluebird 文档是否错误地将函数作为将处理第一个数组的第二个参数?代码有点难以理解,但我看不出如何使用第二个参数(除非由于某种原因这不是我正在寻找的正确代码)。.settle()Promise.settle()

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

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

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


仅供参考,我通过创建一个简单的测试用例并单步执行调试器来验证它从不使用传递给它的第二个参数。这似乎是文档与实现不匹配的情况。我希望有人计划实现记录的内容,但从未完成该实现。Promise.settle()

4赞 Benjamin Gruenbaum 10/28/2014 #2

这确实是文档中的一个错误。它已修复(用于拉取请求的 OP 的道具)。

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

评论

2赞 Benjamin Gruenbaum 11/4/2015
@andig是的,新的 3.0 方式是 ..reflect
0赞 rbarriuso 12/9/2015
就像@andig说的那样,Bluebird v3.0.5 上不存在,但似乎可以工作。reflectsettle
0赞 Benjamin Gruenbaum 12/9/2015
@rbarriuso反映肯定存在于 3.x 中
0赞 andig 12/10/2015
真。Reflect是新的定居点!