【问题标题】:My timeout closure still processes only the last value of the loop. Javascript我的超时关闭仍然只处理循环的最后一个值。 Javascript
【发布时间】:2021-03-16 15:50:34
【问题描述】:

我有一个使用对象调用 executepostaction 的循环。问题是 executepostaction 只执行循环的最后一个值。我尝试了很多闭包,在这里我尝试使用 setTimeout 进行修复,但仍然没有运气。似乎是什么问题?

我的超时功能:

function MakeTimeout(fn, data, timeout) {
            setTimeout(function () { fn.call(null, data); }, timeout);
        }

这是来自事件函数的循环:

for (var ctr = 0; ctr < Selectrows.length; ctr++) {
                    
                    var action=  selectedAction;
                    action["trackId"] = Selectrows[ctr].innerText.replace(/(^\d+)(.+$)/i, '$1');
                    
                    MakeTimeout(function (passaction) {

                        researchService.postExecuteAction(passaction)
                                   .then(function (result) {
                                   }, function error(result) {
                                       $scope.error = result;
                                   });
                    }, action, ctr * 1000);
                }

请帮忙。谢谢

【问题讨论】:

    标签: javascript loops closures settimeout


    【解决方案1】:

    我在那里看到了一些问题,不确定您到底要做什么,但似乎您想为数组的每个值调用一个承诺。

    猜你可以使用 ES6 并且每次调用都是异步的,我会这样做:

    Selectrows.forEach(row => {
      const action = {
        ...selectedAction,
        trackId: row.innerText.replace(/(^\d+)(.+$)/i, '$1')
      };
      
      researchService.postExecuteAction(action)
       .then(function (result) {
          // Do something
       }, function error(result) {
           $scope.error = result;
       });
    });
    1. 如果Selectrows 是一个数组,首先使用forEach 而不是for。
    2. 克隆对象selectedAction bc,如果您只是分配它,那么您每次都使用相同的对象,bc objects and arraysreference types
    3. 您似乎不需要超时,是吗?每个 Promise 都会并行执行,并会在 Promise 返回响应后立即响应。

    【讨论】:

      【解决方案2】:

      您可以在修改对象之前使用扩展语法创建对象的副本。

      var action = {...selectedAction};
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-13
        • 2019-08-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        相关资源
        最近更新 更多