【问题标题】:Get return from function and then use in promise.all()?从函数中获取返回,然后在 promise.all() 中使用?
【发布时间】:2016-07-09 07:00:34
【问题描述】:

我有三个函数,每个函数执行一个 SQL 查询并返回一个数据数组;我知道这部分正在工作,因为我可以在返回数组之前执行 json.stringify 并且它按预期工作。问题是我需要等到这三个函数完成后再用它们做更多的事情。

我使用的每个函数都有相同的调用结构:

this.foo.makeFullJSON().then((fooStorage) => {
    fooJSON = '{foo:[' + JSON.stringify(fooStorage) + ']}';
});

我知道我应该有一个承诺数组,然后将承诺推送给它,然后使用 Promise.all(),但我真的不知道我实际上必须执行的代码的哪一部分开。

编辑:清理一下,我调用的每个 makeFullJSON() 都会返回一个承诺(数组的)。我需要对结果数组做一些事情。

【问题讨论】:

  • 你读过any documentation for Promise.all()吗?你不明白哪个具体部分?
  • 我读过,但不知怎的,Promise.all() 返回了一个已解决的承诺数组。我猜你已经解决了这个问题。
  • Promise.all() 返回一个新的主承诺。在该主 Promise 上调用 .then() 可以让您的回调访问从您传递给 Promise.all() 的所有 Promise 中实现的值(不是 Promise)数组。因此,在您的 .then() 处理程序中,您将获得一组已实现的值。
  • 我认为这应该在我给出的答案中得到很好的说明。所有解析的值都从promise.all传递给.then
  • 没错,但我认为答案是错误的,因为我对必须创建承诺然后将它们推送到一系列承诺中感到困惑;我没有意识到它可能只是 Promise.all([p1,p2,p3]) 在你的回答中。

标签: javascript json sqlite promise


【解决方案1】:

在创建变量时将 promise 分配给它,然后您可以将该变量传递给 promise.all()

由于我看不到您的代码的完整实现,这里有一个工作的、精简的版本,它与 Promise 一起工作,并用一些相似的名称进行了模拟。

function makeFullJSON(time) {
  return new Promise((resolve, reject) => {
    setTimeout(resolve, time, [time]); // send back an array for simulation
  })
}

var p1 = makeFullJSON(1000);
var p2 = makeFullJSON(500);
var p3 = makeFullJSON(750);

p1.then(array => {
  console.log('Promise 1 complete', array);
  // Do other stuff with the return value
});

p2.then(array => {
  console.log('Promise 2 complete', array);
});

p3.then(array => {
  console.log('Promise 3 complete', array);
});

Promise
  .all([p1, p2, p3])
  .then(arrayOfAllResolvedValues => {
    // This array will contain values; the values from the
    // resolved promises in order of adding them to the promises array
    console.log('Array of resolved values:', arrayOfAllResolvedValues);
  });

【讨论】:

  • 不确定,但似乎makeFullJSON 已经返回Promise,因为OP 将then 应用于它。
  • 对。因为我看不到他们的代码,所以我在模拟 makeFullJSON 返回承诺的相同场景。就我而言,是的,我的承诺与 JSON 无关,它只是模拟 OP 的代码是如何工作的,以及在所有承诺之后它们如何解决。
  • 为清晰起见编辑了 OP;我知道我可以使用类似于: var promises = [];然后每个函数返回一个我可以做的承诺: promises.push(function()) 然后有: Promise.all(promises).then(() => {stuff});等到他们都完成了,但这不是问题;问题是我需要处理我调用的每个函数的单独返回。
  • @Arfons,我不确定我是否添加了更多清晰度。但是你已经可以对每个 Promise 的返回值做一些事情了。你在为那个特定的承诺打电话给.then 的地方做这件事。但是,您也可以将所有已解析的变量从 promise.all() 传递到 .then 链中。我已经对我的答案进行了一些更新。让我知道他们是否有帮助
【解决方案2】:

Promise.all() 需要一组 promise 作为参数。 你可以简单地调用

Promise.all([
    this.foo.makeFullJSON1(),
    this.foo.makeFullJSON2(),
    ...]);

由于调用这些函数将返回承诺对象。

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 2018-02-20
    • 2019-02-04
    • 2018-12-05
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    相关资源
    最近更新 更多