代码之家  ›  专栏  ›  技术社区  ›  Rizwan Mohammed

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

  •  0
  • Rizwan Mohammed  · 技术社区  · 7 年前
    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 回复  |  直到 7 年前
        1
  •  3
  •   Titus    7 年前

    $.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);
      });
    }
        2
  •  1
  •   Estus Flask    7 年前

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