在request-native-promise [node.js]内找到未处理的Promise拒绝?

时间:2019-01-29 00:36:45

标签: javascript node.js error-handling promise request

编辑:从那以后,我就开始使用常规的请求库进行管道传输,这可以使错误得到很好的处理。话虽如此,这使我唯一的问题是在极少数情况下程序无法正确退出并需要手动终止的情况。我相信this post是我现在遇到的相同问题。

我有一个程序可以从通过JSON文件获得的URL中下载图像。在较大的请求(超过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'错误'处理程序。据我所知,request.head()不能“那么”使用,并且在try / catch中将整个forEach循环包围起来也不起作用。

我不确定如何解决这些错误,但是目前程序运行良好,我只想确保我现在可以捕获任何错误以改善用户体验。

1 个答案:

答案 0 :(得分:0)

我将其推送到一个promise数组中,然后调用promise.all。

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
});