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