条件/动态数组承诺所有

Luc*_*non 4 javascript promise async-await

我有一个带有promise数组的函数,该数组可以有1到X个promise.

这些承诺基于条件进入数组.

我希望能够区分哪个API来自每个结果,而我无法实现一个干净的方法来实现它

let promises = [];

if (false) {
  let promise1 = request(toUrl);
  promises.push(promise1);
}
if (true) {
  let promise2 = request(toUrl);
  promises.push(promise2);
}

if (false) {
  let promise3 = request(toUrl);
  promises.push(promise3);
}

if (true) {
  let promise4 = request(toUrl);
  promises.push(promise4);
}

try {
  let result = await Promise.all(promises);
} catch (error) {
  console.log(error);
}
Run Code Online (Sandbox Code Playgroud)

所以,如果一切顺利,结果将是一系列结果.不知道哪个条件是真的,我如何知道result [0]是否是promise1,promise2或promise3的结果?

Sur*_*yan 14

您只需添加request(url)有关承诺的其他信息的响应即可

const promise1 = request(url).then(res => ({ res: res, promise: 'prmoise1' }))
Run Code Online (Sandbox Code Playgroud)

Promise.all()你将获得上述形式的承诺的价值,并可以检测哪些承诺得到解决.

const promises = [];

if(true) {
   const promise1 = fetch('https://jsonplaceholder.typicode.com/posts/1').then(res => ({ res: res, promise: 'promise1' }));
   promises.push(promise1);
}

if(false) {
   const promise2 = fetch('https://jsonplaceholder.typicode.com/posts/2').then(res => ({ res: res, promise: 'promise2' }));
   promises.push(promise2);
}

Promise.all(promises).then(res => console.log(res));
Run Code Online (Sandbox Code Playgroud)


小智 5

在我看来,我们可以使用以下代码来简化问题的复杂性 -

let promises = [];

let truthyValue = true,
  falsyvalue = true;
  
 let [promise1, promise2, promise3, promise4] = await Promise.all([
    truthyValue ? request(toUrl) : Promise.resolve({}),
    truthyValue ? request(toUrl) : Promise.resolve({}),
    falsyValue ? request(toUrl) : Promise.resolve({}),
    falsyValue ? request(toUrl) : Promise.resolve({})
 ]);
 
 // promise1 will be called only when truthyValue is set
 if (promise1) {
  // do something
 }
 
  // promise2 will be called only when truthyValue is set
  if (promise2) {
  // do something
 }
 
  // promise3 will be called only when falsyValue is set
  if (promise3) {
  // do something
 }
   // promise4 will be called only when falsyValue is set
  if (promise4) {
  // do something
 }
Run Code Online (Sandbox Code Playgroud)