Обещания портятся? - PullRequest
       4

Обещания портятся?

0 голосов
/ 25 октября 2018

Эта проблема сводила меня с ума последние пару дней.Я далёк от того, чтобы быть экспертом по Javascript, возможно, решение очевидно, но я его не вижу.

Что я в основном пытаюсь сделать, это:

  1. загрузка элементов в paralellкаждый запрос делается для заданного типа элемента (type1, type2) с различными свойствами.
  2. После загрузки выполните функцию обратного вызова для последующей обработки данных (это та же функция с различными параметрами и стест на тип элемента для обработки по-разному)
  3. Сохранение элемента

Если я загружаю 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 меняется.

Любая помощь будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Я не вижу ничего глобального в своем коде, который мог бы объяснить, почему тип меняется.

Это не type, что меняется.Ваша проблема item, которая является невольным глобальным :

for (item of data) {
//   ^^^^

Сделать это

for (const item of data) {
//   ^^^^

И всегда включать строгий режим!

0 голосов
/ 25 октября 2018

Это задание для Promise.all

const p1 = new Promise((res, rej) => res());
Promise.all([p1, p2]).then((results) => results.map(yourFunction));

Promise.all вернет массив разрешенных или может поймать любой отказ.Но вам не нужно отказываться, если вы настроите свой p1, p2, pn с новым Обещанием, которое разрешается только.Тогда ваша карта функций может обрабатывать ветвления и делать правильные вещи для правильного типа ответа.Имеет смысл?

...