node.js + bluebird:解析promise.all

问题描述 投票:0回答:1

我有一个函数requestJSON查询外部API并返回(蓝鸟)承诺。

问题:bc添加到列表之前得到解决,因此promise.all运行,而ab只被解析。

码:

let promises = [];

// push promise a
promises.push(requestJSON(..));

// push promise b
promises.push(requestJSON(..).then((response) {
  // push promise c
  promises.push(requestJSON({foo: response.bar});
});

promises.all((data) => {
  console.log(data.length) // --> 2
});

问题:我无法为这个问题提出一个非常令人满意的解决方案。有节点方式/最佳实践吗?

可能的解决方案

(I)在另一个承诺中包裹b并在c.then内解决它。 问题:除了使代码混乱之外,还有一个额外的承诺。

let promises = [];

// push promise a
promises.push(requestJSON(..));

// push helper promise
promises.push(new Promise((resolve, reject) => {
  // push promise b
  promises.push(requestJSON(..).then((response) {
    // push promise c
    promises.push(requestJSON({foo: response.bar});
    // resolve helper promise
    resolve();
  }).catch(..);
}));


promises.all((data) => {
  console.log(data.length) // --> 4
});

(II)把所有东西都放在b.then里面。 问题:在a +中放置promise.allb没有语义上的理由,这个解决方案让我想起了预先承诺的回调疯狂。

let promises = [];

// push promise b
promises.push(requestJSON(..).then((response) {
  // push promise a
  promises.push(requestJSON(..));

  // push promise c
  promises.push(requestJSON({foo: response.bar});
  
  promises.all((data) => {
    console.log(data.length) // --> 3
  });
});
node.js promise bluebird
1个回答
1
投票

你必须从.then回调中返回一些东西。如果你想继续等待别的东西,要么是价值(然后是承诺被认为已经解决),要么是另一个承诺。

let promises = [
    requestJSON(/* [1] */),
    requestJSON(/* [2] */).then(response => {
        return requestJSON(/* [3] */);
    })
];

// this waits for [1] and [3]
promises.all(promises).then(results => {
    console.log(data.length);
});

你的代码没有从.then()返回任何内容。所以函数返回值是undefined,并且使用undefined作为结果确定了promise。

以上内容可以写成(注意箭头函数中没有完整体的隐式return):

let promises = [
    requestJSON(/* [1] */),
    requestJSON(/* [2] */).then(response => requestJSON(/* [3] */))
];

promises.all(promises).then(results => console.log(data.length));
© www.soinside.com 2019 - 2024. All rights reserved.