for循环内的异步回调

问题描述 投票:0回答:1
var a = ['url1', 'url2', 'url3'];
var op = [];

cb = (callback) => {
  for (var i = 0; i < a.length; i++) {
    gtts.savetos3(`${a[i]}.mp3`, a[i], 'ta', function(url) {
      console.log(url['Location']);
      op.push(url['Location']);
    });
  }
  callback()
}

cb(() => {
   console.log(op);
})

在上面的代码中,gtts.savetos3异步函数。完成数组中每个元素的执行都需要花费大量时间。由于异步功能,我无法打印完整的数组op数组中的url,因为它会打印一个空数组。

gtts.savetos3函数使用正确的URL调用给定的回调,以便我可以使用console.log打印输出,但是当循环时,我就搞砸了。

我的问题是

  1. 如何使回调函数仅在执行后才被调用所有数组元素都由gtts.savetos3函数处理。
  2. 我们可以通过仅使用callbacks
  3. 来在没有Promise.all或没有Promise的情况下实现上述问题的解决方案。

    预先感谢...!

var a = ['url1','url2','url3']; var op = []; cb =(回调)=> {for(var i = 0; i

您可以保留一个计数器并在方法的回调中增加它,仅当计数器达到数组的长度时才调用您的done回调。

cb = (done) => {
    let counter = 1;
    for (let i = 0; i < a.length; i++) {
        gtts.savetos3(`${a[i]}.mp3`, a[i], 'ta', function (url) {
            console.log(url['Location']);
            op.push(url['Location']);
            counter++
        });
    }
    if(counter === a.length) {
        done();
    }
}

cb(() => {
    console.log(op);
})

这仅是在没有Promises或任何第三方模块的情况下解决问题的方法,而不是简洁或正确的方法。

javascript asynchronous callback
1个回答
0
投票

您可以保留一个计数器并在方法的回调中增加它,仅当计数器达到数组的长度时才调用您的done回调。

© www.soinside.com 2019 - 2024. All rights reserved.