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此状态机也可以工作: 异步函数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%!重要;
}
谢谢您的回答。我将在实际代码中尝试它们,看看哪个更可读。