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

时间:2019-01-27 22:24:57

标签: javascript jquery node.js

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

2 个答案:

答案 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;
  }