我有一个函数,我想在返回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
}
任何帮助将不胜感激。
答案 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也将不涉及。