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)
任何帮助将是欣赏.
您需要使用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.
| 归档时间: |
|
| 查看次数: |
29 次 |
| 最近记录: |