【问题标题】:Last value of an asynchronous function in loop循环中异步函数的最后一个值
【发布时间】:2013-08-14 14:53:57
【问题描述】:

我在函数中有这个:

for (i=0; i < toTranslateArray.length; i++)
{
    (function(i)
    {
        getTranslation(toTranslateArray[i],function(callback_result)
        {
            trans += callback_result;
        });         
    })(i);  
}
// code using last value of trans

我需要使用 trans 的最后一个值。我看过很多例子,但我就是无法让它发挥作用。 另一个与我的问题相同的答案:link

【问题讨论】:

  • 您连接结果的顺序是否相关?
  • 当您使用for-in 时,除非您事先计算属性,否则无法可靠地知道您何时处于最后一个值。 toTranslateArray 是一个实际的数组吗?如果是这样,它会变得更简单,尽管您仍然不应该使用for-in,而是使用for 语句。
  • 你尝试过什么让它发挥作用?请向我们展示您的具体尝试,否则我们需要向您推荐具有相同问题的该问题。
  • @smotru:然后查看Why is using “for…in” with array iteration such a bad idea? 并注意getTranslation 是异步的。
  • @CrazyTrain 是的,它是一个数组。那时我会使用 for 。我将在几分钟内向您展示我的新代码。

标签: javascript asynchronous for-loop google-chrome-extension callback


【解决方案1】:

这是处理异步循环的一种非常标准的方法(另请参阅JavaScript closure inside loops – simple practical example):

var results = [];
for (var count=0; count<toTranslateArray.length; count++) (function(i) {
    getTranslation(toTranslateArray[count], function(res) {
        results[i] = res;
        if (! --count) { // when all results are settled (count is back to zero)
            var trans = results.join("");
            // code using trans
        }
    });           
})(count);

请注意,这只在数组中至少有一项时才会执行代码。

【讨论】:

  • 啊,我距离发帖只有几秒钟的路程,但使用的是.forEach()。 +1
  • 你在解决这个问题 2 天后才救了我 .. 我无法理解闭包 :(
猜你喜欢
  • 1970-01-01
  • 2020-03-07
  • 2015-08-26
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多