Javascript 等待aysnc为每个人打电话

Javascript 等待aysnc为每个人打电话,javascript,asynchronous,vuejs2,es6-promise,Javascript,Asynchronous,Vuejs2,Es6 Promise,我有一个函数,在返回jsonObject之前,我想在每个循环上完成第一个this.findLocation()。问题是当函数返回jsonObject时,一些findlocation循环仍然没有完成 这是函数的代码: generate (item) { let jsonObj = {} jsonObj.lookup = this.id this.fields.forEach(field => { if (field.prop === 'API') {

我有一个函数,在返回jsonObject之前,我想在每个循环上完成第一个
this.findLocation()
。问题是当函数返回jsonObject时,一些
findlocation
循环仍然没有完成

这是函数的代码:

generate (item) {
  let jsonObj = {}
  jsonObj.lookup = this.id
  this.fields.forEach(field => {
      if (field.prop === 'API') {
        this.findLocation(item, field).then(function (value) {
          let location = value
          if (location) jsonObj[field.prop] = location.id
        })
      } else {
        jsonObj[field.prop] = item[field.header]
      }
  })
  return jsonObj
}

任何帮助都将不胜感激。

您需要使用
承诺。所有
等待每个异步操作完成:

generate (item) {
  const obj = { lookup: this.id };
  const proms = this.fields.map((field) => {
    if (field.prop === 'API') {
      // Make sure to *return* the `Promise`:
      return this.findLocation(item, field).then((value) => {
        if (value) obj[field.prop] = value.id
      })
    } else {
      obj[field.prop] = item[field.header]
    }
  });
  return Promise.all(proms)
    .then(() => obj);
}
请注意,当像这样使用
.map
时,数组中只有一些项是承诺,但这很好-
承诺。所有
都只会等待数组中的承诺得到解决。数组中的非承诺(包括
未定义的
值)将被忽略

而且一如既往,, -如果你有一个对象或数组,那么你有一个对象或数组,句号。JSON格式是一种用字符串表示对象的方法,如
constmyjson='{“foo”:“bar”}'
。如果不涉及字符串、序列化或反序列化,则也不涉及JSON。

在重复文章中,介绍了如何使用
Promise.all
处理异步调用集合。