Мое закрытие тайм-аута по-прежнему обрабатывает только последнее значение цикла. Javascript

#javascript #loops #closures #settimeout

#javascript #циклы #замыкания #settimeout

Вопрос:

У меня есть цикл, который вызывает 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 = resu<
                                   });
                    }, action, ctr * 1000);
                }
 

Пожалуйста, помогите. Спасибо

Ответ №1:

Вы можете использовать синтаксис распространения для создания копии объекта перед его изменением.

 var action = {...selectedAction};
 

Ответ №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 = resu<
   });
}); 
  1. Сначала используется forEach вместо for, если Selectrows это массив.
  2. Клонируйте объект selectedAction bc, если вы просто назначаете его, вы каждый раз используете один и тот же объект, bc objects and arrays reference types .
  3. Кажется, вам не нужен тайм-аут, или нет? каждое обещание будет выполняться параллельно и будет отвечать, как только обещание вернет ответ.