Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在地图中等待承诺的解决?_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 如何在地图中等待承诺的解决?

Javascript 如何在地图中等待承诺的解决?,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个要处理的对象列表。对象被传递给一个promise函数,该函数执行这个和那个操作,并解析回。根据先前缓存的值,该过程可能是即时的,也可能不是。如果已经有计算值,它将立即解析为该值。否则,它将计算。现在我面临的问题是,在计算第一个对象的状态之前,下一个对象被传递给承诺: let people = [ {groupId: 1, name: 'Jessica Coleman', status: 'Unknown', id:1}

我有一个要处理的对象列表。对象被传递给一个promise函数,该函数执行这个和那个操作,并解析回。根据先前缓存的值,该过程可能是即时的,也可能不是。如果已经有计算值,它将立即解析为该值。否则,它将计算。现在我面临的问题是,在计算第一个对象的状态之前,下一个对象被传递给承诺:

   let people = [ 
                {groupId: 1, name: 'Jessica Coleman', status: 'Unknown', id:1}
                {groupId: 1, name: 'Eric Tomson', status: 'Unknown', id:2}
                {groupId: 1, name: 'Samuel Bell', status: 'Unknown', id:3}

      ];
现在,我想在循环过程中完全等待承诺得到解决,即使承诺需要一分钟的时间来计算实例。同一组的所有人都具有相同的身份。因此,promise检查是否已经计算了一个组。如果是,则返回。否则,它会计算。这就是问题所在。在杰西卡1号完成之前,其他人都通过了

    people.map(function(person) {
   // return the promise to array
   this.calculatorService
    .getStatus(person)
    .then(function(res) {
      person.status = res;


    });
});

使其与
async/await
同步工作。(
for..of
.map
更适合这种情况,顺便说一句)

for(让人成为人中的人){
person.status=等待此.calculatorService.getStatus(person);
})

map
forEach
这样的数组迭代器不能与承诺一起工作,因为它们不知道如何等待结果。改用一个简单的
for
循环:

for (let person of people)
  person.status = await this.calculatorService.getStatus(person)
如果您确实想要一种“功能性”方法(并避免显式异步/等待),您可以定义一个类似于bluebird的函数:

然后像这样应用它:

function setStatus(person) {
    return calculatorService
        .getStatus(person)
        .then(res => person.status = res);
}

Promise.each(people, setStatus).then(...)
你可以这样试试

let people = [ 
  {groupId: 1, name: 'Jessica Coleman', status: 'Unknown', id:1},
  {groupId: 1, name: 'Eric Tomson', status: 'Unknown', id:2},
  {groupId: 1, name: 'Samuel Bell', status: 'Unknown', id:3}
];


for (let person of people) {
  await this.calculatorService.getStatus(person).then(res => {
    person.status = res;
  });
}

您可以使用递归函数:

let people=[
{groupId:1,名称:'Jessica Coleman',状态:'Unknown',id:1},
{groupId:1,名称:'Eric Tomson',状态:'Unknown',id:2},
{groupId:1,名称:'Samuel Bell',状态:'Unknown',id:3}
];
功能recCalculatorService(人员){
如果(!people | |!people.length){
返回;
}
这是计算机服务
.getStatus(people.shift())
.然后(功能(res){
person.status=res;
recCalculatorService(人员);
});
}
//如果要保持人物数组的完整性,请使用people.slice()
recCalculatorService(人员);

这是否回答了您的问题?我建议您不要使用
.forEach
进行异步工作,因为实际上没有办法等待循环完成。一个或一个简单的
for
循环更合适。既然wait不能在非异步函数中工作,那么异步会在哪里呢?@WedeAsmeraTseada包含此循环构造的函数需要标记为
async
。您的
数组中没有返回任何内容。map
;即使您这样做了,您也不能最终等待
Array.map
完成异步工作。而且,这远比它需要的复杂。为什么要将一个
承诺
包装到另一个
承诺
中?是的,它很复杂,但工作正常,我编辑了我的答案,现在返回了一个更新的值。谢谢你指出我的错误:)我在第一次评论中指出的所有错误仍然存在。您还将
Array.map
用作循环。它没有真正映射任何东西。您不需要将
这个.calculatorService.getStatus(person)
包装到另一个
Promise
中。我将亲自编辑您的答案,以便向您展示。下面是一个使用模拟
getStatus
函数的示例:
let people = [ 
  {groupId: 1, name: 'Jessica Coleman', status: 'Unknown', id:1},
  {groupId: 1, name: 'Eric Tomson', status: 'Unknown', id:2},
  {groupId: 1, name: 'Samuel Bell', status: 'Unknown', id:3}
];


for (let person of people) {
  await this.calculatorService.getStatus(person).then(res => {
    person.status = res;
  });
}