提问人:Madara's Ghost 提问时间:10/28/2014 最后编辑:Madara's Ghost 更新时间:10/28/2014 访问量:2685
Bluebird 的 Promise.settle 无法解析正确的值
Bluebird's Promise.settle doesn't resolve with the correct values
问:
我有以下代码:
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
预期的行为是,结果是一个 promise,在原始数组中的图像上传到 imgur(或“#”,如果上传因任何原因失败)后,该 promise 会用 imgur 链接数组解析。.map
相反,Promise.settle 会立即解析(即似乎不等待 imgur 上传),并且是数组中的原始图像 url(在尝试读取字符串的属性时会出现错误)。inspection.value()
matches
.data.link
为什么会这样?为什么它不能上传到 imgur 并正确解析?
答:
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 上不存在,但似乎可以工作。reflect
settle
0赞
Benjamin Gruenbaum
12/9/2015
@rbarriuso反映肯定存在于 3.x 中
0赞
andig
12/10/2015
真。Reflect是新的定居点!
评论
Promise.settle(matches, imgur.uploadUrl).then(function(results) { ... })
results
.settle()
.map()
.settle()
.settle()
.map()
Promise.settle()
.settle()
Promise.settle()
Promise.settle(matches.map(imgur.uploadUrl))