如何将其他参数传递给下一步"步骤"承诺?
new Promise((resolve, reject) => {
const a = // do stuff and return a string
return Promise.all([
// execute another promise,
// execute yet another promise
])
})
.then(([resultFromPromise_1, resultFromPromise_2]) => {
// how do i pass `const a` here?
})
我可以将new Promise(resolve => resolve(a))
之类的内容添加到Promise.all
数组中,但这看起来很难看。在这种情况下,有更好的方法来传递数据吗?
答案 0 :(得分:2)
我可以将
new Promise(resolve => resolve(a))
之类的内容添加到Promise.all
数组中,但这看起来很难看。在这种情况下,有更好的方法来传递数据吗?
是:使用then
。如果您已经有承诺,则永远不需要使用new Promise
。 then
创建一个promise,等待解析你调用它的那个,然后通过then
回调返回的内容得到解决,如果抛出异常则被拒绝。承诺的关键之一是如何在链中的每个链接上使用then
(和catch
)转换事物。
在这种特定情况下,您在原始承诺上使用then
并使用其回调来使用a
转换结果(尽管如果您想等到它们全部完成,那么您也可以这样做;稍后介绍。)
附注:问题代码开头的new Promise
行不应该在那里,你不会从承诺执行者那里返回一个承诺(回调)你转到new Promise
)。
示例:
const a = "some string";
Promise.all([
getPromise("one").then(result => result + " - " + a), // ***
getPromise("two")
])
.then(results => {
console.log(results);
});
function getPromise(str) {
// (Could use Promise.resolve here; emphasizing asynchronousness)
return new Promise(resolve => {
setTimeout(() => {
resolve(str);
}, 250);
});
}
或者,如果你真的只想在传递给a
的所有承诺得到解决时使用Promise.all
,那么你也可以这样做:
const a = "some string";
Promise.all([
getPromise("one"),
getPromise("two")
])
.then(([result1, result2]) => {
return [result1 + " - " + a, result2]; // ***
})
.then(results => {
console.log(results);
});
function getPromise(str) {
// (Could use Promise.resolve here; emphasizing asynchronousness)
return new Promise(resolve => {
setTimeout(() => {
resolve(str);
}, 250);
});
}
答案 1 :(得分:1)
首先,你的第一个承诺有错误,你没有解决它。你应该这样做:
11:18:38.388 [main] DEBUG org.jboss.weld.Bootstrap - WELD-000106: Bean: Producer Field [Logger] with qualifiers [@Any @Default] declared as [[UnbackedAnnotatedField] @Produces RestInterceptorTest.logger]
至于您的问题,您可以直接将new Promise((resolve, reject) => {
const a = 1;
resolve(Promise.all([
...
]))
})
传递给new Promise(resolve => resolve(a))
数组,而不是a
。即:
all