链接这个承诺

时间:2018-03-24 01:46:02

标签: javascript node.js promise

当你需要将结果附加到位于函数范围顶层的数组时,链接某些东西的正确方法是什么?

function run() {
    let array = []

    let input = 'object'

    promiseA(input)
    .then((result) => {
        array.push(result)
    })

    promiseB(input)
    .then((result) => {
        array.push(result)
    })

    console.log(array.join(' '))
}

订单对我的申请无关紧要,如果认为是最佳实践,我可以将其并行化。它实际上只是检查一个条件,没有异步调用来从API或类似的东西中获取结果。

4 个答案:

答案 0 :(得分:2)

您应该使用Promise.all等待承诺A并承诺B完成。 Promise.all将收到一系列结果(来自每个Promise),然后您可以使用它们。

你可能有类似的东西:

var promiseA =       doSomethingThatReturnsPromise(input);
var promiseB = doSomethingThatReturnsPromise(anotherInput);

Promise.all([promiseA, promiseB]).then(function(resultsArray) { // do something });

答案 1 :(得分:2)

你的功能看起来像这样

function run () {
 return Promise.all([promiseA(), promiseB()]).then(([resultA, resultB])=>{ }) 
}

答案 2 :(得分:1)

另一种方法是使用async功能:

这种方法逐个执行承诺,这样你就能用所需的执行顺序处理结果。

function promiseA(input) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(input);
    }, 1000);
  });
}

function promiseB(input) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve(input);
    }, 500);
  });
}

async function run() {
  let array = [];
  
  let input = 'Ele';
  array.push(await promiseA(input));

  input = "from SO";
  array.push(await promiseB(input));

  console.log(array.join(' '))
}

console.log('Wait for 1.5sec...')
run()

答案 3 :(得分:0)

回答问题

这是对Promises进行排序或链接的正确方法:

one(arr).then(two).then(log, fail);

这直接回答了问题,但没有提供其他可能的解决方案。

请注意,没有副作用。绝对避免在评论中提到的“范围”问题。

示例代码段实现了这个:

let arr = [];

function one(arr) {
  return new Promise((res, rej) => {
    arr.push('one');
    res(arr);
  });
}
function two(arr) {
  return new Promise((res, rej) => {
    arr.push('two');
    res(arr);
  });
}

function log(arr){
  console.log(arr);
}

function fail(reason){
  console.log(reason);
}



one(arr).then(two).then(log, fail);