如何等到jQuery函数完成后再继续?

问题描述 投票:0回答:2
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

javascript jquery node.js
2个回答
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
投票

在承诺已经存在的情况下,new Promise被称为承诺建筑反模式。

$.getJSON返回jQuery延迟对象,它可以产生一个可以awaited的承诺:

  async function tempfunc2(result) {
    const data = await $.getJSON(url).promise();
    if (data.mappings["0"])
      gameHashes.push(data.mappings["0"].game);

    return gameHashes;
  }
© www.soinside.com 2019 - 2024. All rights reserved.