JavaScript承诺:传递参数的常规方式

JavaScript承诺:传递参数的常规方式,javascript,promise,Javascript,Promise,我如何将其他参数传递到承诺的下一个“步骤” 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

我如何将其他参数传递到承诺的下一个“步骤”

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?
})
我可以在
Promise.all
数组中添加类似
newpromise(resolve=>resolve(a))
的内容,但这看起来很难看。在这种情况下,是否有更好的方法传递数据

我可以在
Promise.all
数组中添加类似
newpromise(resolve=>resolve(a))
的内容,但这看起来很难看。在这种情况下,是否有更好的方法传递数据

是:使用
然后使用
。如果您已有承诺,则无需使用
新承诺
then
创建一个承诺,该承诺等待您调用它的承诺的解决方案,然后使用您从
then
回调返回的内容得到解决,或者在抛出异常时被拒绝。承诺的关键之一是如何使用
然后
(和
捕获
)在链中的每个环节转换事物

在这种特定情况下,您可以对原始承诺使用
then
,并使用其回调来使用
a
转换结果(尽管如果您想等到它们全部完成,您也可以这样做;稍后将介绍)

旁注:问题代码开头的
new Promise
行不应该出现,您不能从承诺执行者那里返回承诺(您传递给
new Promise
的回调)

例如:

const a=“一些字符串”;
我保证([
然后(结果=>结果+“-”+a),//***
getPromise(“两个”)
])
。然后(结果=>{
控制台日志(结果);
});
函数getPromise(str){
//(此处可以使用Promise.resolve;强调异步)
返回新承诺(解决=>{
设置超时(()=>{
决心(str);
}, 250);
});
}
我可以在
Promise.all
数组中添加类似
newpromise(resolve=>resolve(a))
的内容,但这看起来很难看。在这种情况下,是否有更好的方法传递数据

是:使用
然后使用
。如果您已有承诺,则无需使用
新承诺
then
创建一个承诺,该承诺等待您调用它的承诺的解决方案,然后使用您从
then
回调返回的内容得到解决,或者在抛出异常时被拒绝。承诺的关键之一是如何使用
然后
(和
捕获
)在链中的每个环节转换事物

在这种特定情况下,您可以对原始承诺使用
then
,并使用其回调来使用
a
转换结果(尽管如果您想等到它们全部完成,您也可以这样做;稍后将介绍)

旁注:问题代码开头的
new Promise
行不应该出现,您不能从承诺执行者那里返回承诺(您传递给
new Promise
的回调)

例如:

const a=“一些字符串”;
我保证([
然后(结果=>结果+“-”+a),//***
getPromise(“两个”)
])
。然后(结果=>{
控制台日志(结果);
});
函数getPromise(str){
//(此处可以使用Promise.resolve;强调异步)
返回新承诺(解决=>{
设置超时(()=>{
决心(str);
}, 250);
});

}
首先,你的第一个承诺有错误,你没有解决它。你应该这样做:

new Promise((resolve, reject) => {
  const a = 1;
  resolve(Promise.all([
    ...    
 ]))
})
至于您的问题,您可以直接将
a
传递给
all
数组,而不是
newpromise(resolve=>resolve(a))
。即:

new Promise((resolve, reject) => {
  const a = 1;
  resolve(Promise.all([
    Promise.resolve("a"),
    Promise.resolve("b"),
    a,
  ]))
})
.then(([resultFromPromise_1, resultFromPromise_2, a]) => {
   console.log(a);
})

首先,你的第一个承诺有错误,你没有解决它。你应该这样做:

new Promise((resolve, reject) => {
  const a = 1;
  resolve(Promise.all([
    ...    
 ]))
})
至于您的问题,您可以直接将
a
传递给
all
数组,而不是
newpromise(resolve=>resolve(a))
。即:

new Promise((resolve, reject) => {
  const a = 1;
  resolve(Promise.all([
    Promise.resolve("a"),
    Promise.resolve("b"),
    a,
  ]))
})
.then(([resultFromPromise_1, resultFromPromise_2, a]) => {
   console.log(a);
})

你能更具体地说明你想要实现什么吗?也许a有一个不使用
a
的运行示例,并且(正如您在上面所做的)有一条注释,显示您想在哪里使用它以及您想用它做什么?您能更具体地说明您想实现什么吗?也许一个正在运行的示例没有使用
a
,并且(正如您在上面所做的)一条注释显示了您想要在哪里使用它以及您想要用它做什么?
newpromise(resolve=>{resolve(x);})
编写
Promise.resolve(x)
只是一个很长的过程。在本例中,
x
Promise.all(…)
,它已经返回了一个Promise,所以它完全没有意义。:-)在
Promise.all
中传递
a
的有趣想法。如果您已经在使用
Promise.all
,这绝对不是个坏主意!但它不是通用的解决方案……你说它不是通用的是什么意思?将值直接传递给
all
数组是将更多
参数传递给
下一步的一种方式,这就是这个问题所要问的。我的意思是,如果您处理的是单个承诺,而不是使用
promise.all
。虽然我想你可以添加
Promise.all
,如果你还没有使用它的话。我想我会坚持使用闭包,但又是一个有趣的想法。我明白了,如果这是一个简单的承诺,那么您也可以只返回下一步的值,承诺返回可以是一个新的承诺,也可以只是一个值。
newpromise(resolve=>{resolve(x);}
编写
promise.resolve(x)
还有很长的路要走。在本例中,
x
Promise.all(…)
,它已经返回了一个Promise,所以它完全没有意义。:-)在
Promise.all
中传递
a
的有趣想法。如果您已经在使用
Promise.all
,这绝对不是个坏主意!但它不是通用的解决方案……你说它不是通用的是什么意思?将值直接传递给
all
数组是传递更多
参数的一种方式