我的超时闭包仍然只处理循环的最后一个值。Java脚本

My timeout closure still processes only the last value of the loop. Javascript

提问人:Syd Hartha 提问时间:12/4/2020 最后编辑:FerdinandoSyd Hartha 更新时间:12/5/2020 访问量:46

问:

我有一个循环,它使用一个对象调用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 循环 闭包 setTimeout

评论


答:

0赞 Unmitigated 12/4/2020 #1

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

var action = {...selectedAction};
1赞 Rodrigo 12/4/2020 #2

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

猜测您能够使用 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. 首先是 using 而不是 for if 是一个数组。forEachSelectrows
  2. 克隆对象 bc 如果您只是分配它,则每次都使用相同的对象,bc are .selectedActionobjects and arraysreference types
  3. 看来你不需要超时,或者是吗?每个 promise 将并行执行,并在 promise 返回响应后立即响应。