Эта проблема сводила меня с ума последние пару дней.Я далёк от того, чтобы быть экспертом по Javascript, возможно, решение очевидно, но я его не вижу.
Что я в основном пытаюсь сделать, это:
- загрузка элементов в paralellкаждый запрос делается для заданного типа элемента (type1, type2) с различными свойствами.
- После загрузки выполните функцию обратного вызова для последующей обработки данных (это та же функция с различными параметрами и стест на тип элемента для обработки по-разному)
- Сохранение элемента
Если я загружаю 1 тип элемента, все в порядке.Но если я загружаю 2 типа, то в какой-то момент в цикле обработки во время первого выполнения обратного вызова, именно тогда, когда обратный вызов выполняется 2-й раз для 2-го типа, тогда проверка типа покажет, что это 2-й тип, а элементы1-го типа ...
Вот фрагмент кода:
downloadType1();
downloadType2();
// 2nd argument of download() is the callback function
// 3rd argument is the callback function parameters
function downloadType1() {
// Some stuff here
let callbackParameters = ['type1', 'directory1'];
download('url', headacheCallback, callbackParameters);
}
function downloadType2() {
// Some the stuff here
let callbackParameters = ['type2', 'directory2'];
download('url', headacheCallback, callbackParameters);
}
async function download(url, callbackBeforeSave, callbackParameters) {
// Some stuff here
let response;
try {
response = await rp(url);
} catch (e) {
console.log("Error downloading data");
}
// Call callbacks before saving the data
if(callbackBeforeSave) {
let updatedResponse;
if (callbackParameters) {
updatedResponse = await callbackBeforeSave(response, ...callbackParameters);
} else {
updatedResponse = await callbackBeforeSave(response);
}
response = updatedResponse;
}
// Some stuff here with the post-processed data
}
async function headacheCallback(data, type, directory) {
for (item of data) {
// Some stuff here, include async/await calls (mostly to download and save files)
console.log(type, item.propertyToUpdate, item.child.propertyToUpdate);
// This is were my issue is.
// The test will success although I'm still the 'type1' loop. I know because the console.log above shows the item is indeed of type 'type1'
if (type === 'type2') {
item.child.propertyToUpdate = newUrl; // Will eventually fail because 'type1' items don't have a .child.propertyToUpdate property
} else {
item.propertyToUpdate = newUrl;
}
}
}
В какой-то момент результат console.log
будет: type2 <valueOfTheProperty> undefined
, который должен быть type2 undefined <valueOfTheProperty>
...
Быстрая мысль:в первой версии обратного вызова я использовал глобальные переменные arguments
в сочетании с function.apply(...)
.Это было плохо именно потому, что arguments
было глобальным и, следовательно, было изменено после 2-го вызова ...
Но сейчас я не вижу ничего глобального в моем коде, который мог бы объяснить, почему type
меняется.
Любая помощь будет принята с благодарностью.
Спасибо!