等待aysnc呼叫每个

Jos*_*ove 2 javascript asynchronous es6-promise vuejs2

我有一个函数,我想this.findLocation()在返回jsonObject之前完成每个循环的第一个.问题是当函数返回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
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将是欣赏.

Cer*_*nce 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);
}
Run Code Online (Sandbox Code Playgroud)

注意,当.map像这样使用时,只有数组中的一些项目是Promises,但这很好 - Promise.all只需要等待数组中的promise来解决.数组中的非承诺(包括undefined值)将被忽略.

此外,与往常一样, 没有"JSON对象" - 如果你有一个对象或数组,那么你有一个对象或数组,完全停止.JSON格式是一种表示字符串中对象方法,如const myJSON = '{"foo":"bar"}'.如果没有涉及字符串,序列化或反序列化,则也不涉及JSON.