Найти необработанные отклонения обещаний внутри request-native-обещания [node.js]? - PullRequest
0 голосов
/ 29 января 2019

РЕДАКТИРОВАТЬ : С тех пор я начал использовать обычную библиотеку запросов для конвейерной передачи, которая позволяет обрабатывать ошибки нормально.С учетом вышесказанного, моей единственной проблемой остается тот редкий случай, когда программа не завершается должным образом и требует ручного завершения.Я считаю, этот пост - та же проблема, с которой я сталкиваюсь сейчас.

У меня есть программа, которая загружает изображения из URL-адресов, полученных через файл JSON.При больших запросах (более 80 изображений) я получу ошибки в паре файлов, таких как ETIMEDOUT и Socket Hangup.

Я пытаюсь выяснить, где именно нужно отлавливать эти необработанные ошибки обещания, возникающие по мере их появления.заставить мою программу некорректно завершать работу, иногда вынуждая пользователя нажать Ctrl + C, чтобы прекратить выполнение программы.

request({ uri: url, json: true })
.then((data) => {
    const fileArray = [];
    data.posts.forEach((el) => {
        if (!el.filepath) return;
        fileArray.push(el.filepath);
    });
    return fileArray;
})
.then((arr) => {
    arr.forEach(el => {
        request.head(el, () => {
            request({ url: el, encoding: null, forever: true })
                .pipe(createWriteStream(el))
                .on('close', () => { console.log('File Downloaded!'); })
                .on('error', (e) => { console.log(e); });
        });
    });
})
.catch((error) => console.log(error));

Первый блок запроса кода должен быть неактуальным, поскольку ошибки при загрузке файла НЕна запрос данных JSON.К .pipe () прикреплен обработчик .on 'error'.Насколько мне известно, request.head () не «тогда способен», и окружение цикла forEach в try / catch также не работает.

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

1 Ответ

0 голосов
/ 29 января 2019

Я бы поместил его в массив обещаний, а затем вызвал обещание. Все.

var filesToProcess = [];
request({ uri: url, json: true })
.then((data) => {
    const fileArray = [];
    data.posts.forEach((el) => {
        if (!el.filepath) return;
        fileArray.push(el.filepath);
    });
    return fileArray;
})
.then((arr) => {
    arr.forEach(el => {
        var promise = new Promise(function(resolve, reject) {  
             request.head(el, () => {
                 request({ url: el, encoding: null, forever: true })
                    .pipe(createWriteStream(el))
                    .on('close', () => { resolve('File Downloaded!'); })
                    .on('error', (e) => { reject(e); });
        });
        filesToProcess.push(promise);  
    })


    });
})
.catch((error) => console.log(error));

Promise.all(filesToProcess).then(values => {    
    //all of the promises successful
}).catch(err => {
   //one of the promises failed
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...