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
。
一旦得到$.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);
});
}
在承诺已经存在的情况下,new Promise
被称为承诺建筑反模式。
$.getJSON
返回jQuery延迟对象,它可以产生一个可以await
ed的承诺:
async function tempfunc2(result) {
const data = await $.getJSON(url).promise();
if (data.mappings["0"])
gameHashes.push(data.mappings["0"].game);
return gameHashes;
}