Javascript 构建一个对象数组,其中一些字段需要远程数据

Javascript 构建一个对象数组,其中一些字段需要远程数据,javascript,async-await,Javascript,Async Await,我正在尝试构建一个对象数组,其中一些字段需要远程数据。我写了下面的概念证明,它可以工作,但是并行阵列感觉很混乱。如能提出建议,将钥匙和承诺放在一起,我们将不胜感激: async function p1(x) { return new Promise((resolve) => { setTimeout(() => { resolve(`p1-${x}`); }, 250); }); } async function p2(x) { return

我正在尝试构建一个对象数组,其中一些字段需要远程数据。我写了下面的概念证明,它可以工作,但是并行阵列感觉很混乱。如能提出建议,将钥匙和承诺放在一起,我们将不胜感激:

async function p1(x) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`p1-${x}`);
    }, 250);
  });
}

async function p2(x) {
  return new Promise((resolve) => {
    setTimeout( () => {
      resolve(`p2-${x}`);
    }, 250);
  });
}

async function t(n) {
  return { a: await p1(n), b: await p2(n), c: n };
}

async function r() {
  const keys = [];
  const values = [];
  for (let i = 0; i < 2; i++) {
    const key = `k${i}`
    keys.push(key);
    values.push(t(key));
  }
  const x = await Promise.all(values);
  const results = {};
  for (let i = 0; i < keys.length; i++) {
    results[keys[i]] = x[i];
  }
  return results;
}

(async () => {
  const answers = await r();
  console.log('answers', answers);
})().catch((e) => {
  console.log(e);
});
异步函数p1(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p1-${x}`); }, 250); }); } 异步函数p2(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p2-${x}`); }, 250); }); } 异步函数t(n){ 返回{a:awaitp1(n),b:awaitp2(n),c:n}; } 异步函数r(){ 常量键=[]; 常量值=[]; for(设i=0;i<2;i++){ const key=`k${i}` 按键。按(键); 推(t(键)); } 常数x=等待承诺。全部(值); const results={}; for(设i=0;i{ const answers=wait r(); console.log('answers',answers); })()捕获((e)=>{ 控制台日志(e); });
此状态机也可以工作:

异步函数p1(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p1-${x}`); }, 250); }); } 异步函数p2(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p2-${x}`); }, 250); }); } 异步函数t(n){ 返回{a:awaitp1(n),b:awaitp2(n),c:n}; } 异步函数r(){ 常量结果={} for(设i=0;i<2;i++){ const key=`k${i}` 结果[键]=等待t(键) } 返回结果; } (异步()=>{ const answers=wait r(); console.log('answers',answers); })()捕获((e)=>{ 控制台日志(e);
});无需在单独的循环中缓存键和值。您可以随时构建结果对象:

异步函数p1(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p1-${x}`); }, 250); }); } 异步函数p2(x){ 返回新承诺((解决)=>{ 设置超时(()=>{ 解析(`p2-${x}`); }, 250); }); } 异步函数t(n){ 返回{a:awaitp1(n),b:awaitp2(n),c:n}; } 异步函数r(){ 让结果={}; for(设i=0;i<2;i++){ const key=`k${i}` 结果[键]=等待t(键); } 返回结果; } (异步()=>{ const answers=wait r(); console.log('answers',answers); })()捕获((e)=>{ 控制台日志(e); });
我想我的
r
方法是:

async function r() {
  const results = {};
  const promises = [];
  for (let i = 0; i < 2; i++) {
    const key = `k${i}`
    promises.push(t(key).then(value => results[key] = value));
  }
  await Promise.all(promises);
  return results;
}
。作为控制台包装器{
最大高度:100%!重要;

}
谢谢您的回答。我将在实际代码中尝试它们,看看哪个更可读。