if语句中的同步多个promise

时间:2018-06-19 00:10:21

标签: javascript promise es6-promise

我的功能在if中最终确定承诺之前结束。 我们的想法是能够以同步的方式执行promises(必要的),以便在返回对象时,完成所有承诺并完成所有承诺。

let var1 = '';
let var2 = '';
let var3 = '';

if(condition1){
  promise1().then(result =>{
    var1 = result;
  )
}

if(condition2){
  promise2().then(result =>{
    var2 = result;
  )
}

if(condition3){
  promise2().then(result =>{
    var3 = result;
  )
}

let object = {
  var1: var1,
  var2: var2,
  var3: var3
}

resolve(object);

我最初做的是使用Promise.all,但它不起作用,并且该函数返回对象而不完成承诺。这是我的实施。

let var1 = '';
let var2 = '';
let var3 = '';
let array_promises = [];
if(condition1){
  promise1().then(result =>{
    var1 = result;
    array_promises.push(result);
  )
}

if(condition2){
  promise2().then(result =>{
    var2 = result;
    array_promises.push(result);
  )
}

if(condition3){
  promise2().then(result =>{
    var3 = result;
    array_promises.push(result);
  )
}
.
.
.


Promise.all(array_promises).then(()=>{
  let object = {
   var1: var1,
   var2: var2,
   var3: var3
   .
   .
   .
  }
  resolve(object);
});

它也没用。返回对象而不完成promises的执行。 我不想使用任何第三方npm或类似的东西。任何指导或建议?,我可能做错了什么

1 个答案:

答案 0 :(得分:4)

你需要在一个 Promises数组上调用Promise.all - 如果数组不包含实际的Promises,那么Promise.all将不会等待任何事情,并且会尽快解决。您的array_promises不是Promise的数组,它只是一个可能被推送到的值数组。请尝试在承诺本身上调用Promise.all

const condition1 = true;
const condition2 = false;
const condition3 = true;
const promise1 = () => new Promise(resolve => setTimeout(resolve, 200, 'p1'));
const promise2 = () => new Promise(resolve => setTimeout(resolve, 200, 'p2'));
const promise3 = () => new Promise(resolve => setTimeout(resolve, 200, 'p3'));

Promise.all(([
  condition1 ? promise1() : '',
  condition2 ? promise2() : '',
  condition3 ? promise3() : '',
])).then(([var1, var2, var3]) => {
  const returnObj = {
    var1,
    var2,
    var3,
  };
  console.log(returnObj);
})

这是有效的,因为在传递给Promise.all的数组中,任何非promises的值都将按原样传递给.then

通过resolve(object);看起来,好像整个代码都在Promise构造函数中。如果是这种情况,那么如果你改为返回 Promise.all调用,而不是显式创建另一个新的Promise,那可能会更好。