async function tempfunc2(result) {
return new Promise((resolve, reject) => {
for(var i = 0; i < result.length; i++)
{
var url = "SomeURLGeneratedByPreviousFunction";
$.getJSON(url, function(data) {
if (data.mappings["0"]) {
gameHashes.push(data.mappings["0"].game);
}
});
}
return resolve(gameHashes);
});
}
我有此代码块正在获取和填充数据。它处理大量数据,因此需要一些时间。
我想要的是此功能在完成之前完成,因为下一行代码依赖于此功能的结果。
但是,按照其当前的构建方式,它将在函数完成之前返回哈希值。我如何等待这个jQuery函数?
我尝试将.then()
放在$.getJSON
之后,但变化不大。
我还尝试将特定的片段放在其他函数中以等待它,但是那也不起作用
await tempfunc().then(tempfunc2);
这就是所谓的tempfunc2
。
答案 0 :(得分:3)
从$.getJSON
得到答复后,您需要兑现承诺。
类似这样的东西:
async function tempfunc2(result) {
return new Promise((resolve, reject) => {
$.getJSON(url, function(data) {
if (data.mappings["0"]) {
gameHashes.push(data.mappings["0"].game);
}
resolve(gameHashes)
});
})
}
确保将gameHashes
定义为数组。
从编辑到问题,似乎您在打多个&.getJSON
。在这种情况下,您需要执行以下操作:
function tempfunc2(result) {
return new Promise(async resolve => {
const promises = result.map(value => {
return new Promise(resolve => {
$.getJSON(url, function(data) {
resolve(data)
});
});
})
let results = await Promise.all(promises)
results = results.filter(v => v.mapping && v.mapping["0"]).map(v => v.mapping["0"].game)
resolve(results);
});
}
答案 1 :(得分:1)
new Promise
在已经存在诺言的情况下称为诺言构造反模式。
$.getJSON
返回jQuery延迟对象,它可以产生一个可以await
编辑的承诺:
async function tempfunc2(result) {
const data = await $.getJSON(url).promise();
if (data.mappings["0"])
gameHashes.push(data.mappings["0"].game);
return gameHashes;
}