JavaScript Promises:传递参数的传统方式

时间:2017-01-25 10:07:25

标签: 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]) => {
  // how do i pass `const a` here?
})

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

2 个答案:

答案 0 :(得分:2)

  

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

是:使用then。如果您已经有承诺,则永远不需要使用new Promisethen创建一个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