等待每个的aysnc呼叫

时间:2018-11-21 04:22:56

标签: 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') {
        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
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

您需要使用Promise.all等待每个异步操作完成:

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时,只有数组中的某些项目才是Promises,但这很好-Promise.all仅会等待 promises 在数组中解析。数组中的非承诺(包括undefined值)将被忽略。

而且,一如既往, There's no such thing as a "JSON Object"-如果您有一个对象或数组,那么您有一个对象或数组,句号。 JSON格式是一种用字符串表示对象的方法 ,例如const myJSON = '{"foo":"bar"}'。如果不涉及任何字符串,序列化或反序列化,那么JSON也将不涉及。