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

标签 javascript node.js error-handling promise request

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

我有一个程序可以从通过JSON文件获得的URL下载图像。在大请求(超过80张图像)下,我将在几个文件(例如ETIMEDOUT和Socket hangup)上出错。

我试图弄清楚我到底需要在哪里捕获这些未处理的 promise 错误,因为它们使我的程序无法正确退出,有时会迫使用户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循环包围起来也不起作用。

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

最佳答案

我将其 push 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
});

关于javascript - 在request-native-promise [node.js]内找到未处理的Promise拒绝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412290/

相关文章:

ajax - 从 AJAX 获取错误消息时出现问题 - 仅在电话上出错

javascript - 无法使用 Google map 在 'write' 上执行 'Document'(InfoWindow 问题)

javascript - 等待后台图片加载

javascript - 如何使用 JavaScript、jQuery 或 CSS 将鼠标悬停在单个 <a> 标记下的各种元素上时添加不同的样式

javascript - 创建 mask 叠加聚光灯效果以显示图像

node.js - NodeJS 子域 w/vhost 和 greenlock-express

node.js - 当我运行 "expo init my-app"时,我无法使用 expo 构建项目(React Native 和 Node)

paypal - Vauge PayFlow 错误

node.js - ./configure 在 node.js tar 中不存在

c# - 无效的ID应该抛出什么异常?