未处理的承诺拒绝,即使我确实处理了它

Mos*_*she 6 javascript request promise

我将一个request-promise-native调用包装在一个返回承诺的函数中。

import request from 'request-promise-native';
function requestWrapper(url) {
    return request(url)
        .then(data => {...})
        .catch(err => Promise.reject(err));
}
Run Code Online (Sandbox Code Playgroud)

简单吧?

现在我正在使用这个函数,并且then工作正常,但catch从未捕获Promise.reject

requestWrapper('http://some-url.com')
    .then(data => {...})
    .catch(err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

我从来没有接过电话catchcatch如果我将of中的 return 语句更改为requestWrapper

.catch(err => err)
Run Code Online (Sandbox Code Playgroud)

甚至这个:

.catch(err => Promise.resolve(err))
Run Code Online (Sandbox Code Playgroud)

要返回 a ,我按照预期得到了调用的错误resolve堆栈。thenrequestWrapper

节点喊道:

(node:24260) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): ...
Run Code Online (Sandbox Code Playgroud)

Mos*_*she 6

好的,感谢@pathurs 和@Hendry,我得到了我需要的东西。

首先,正确的方法是 @Hendry 建议的,即不要在包装器中处理 catch,而是在函数调用中处理。这就是我走过的路:

function requestWrapper(url) {
    return request(url)
        .then(data => {...})
}
requestWrapper('http://some-url.com')
    .then(data => {...})
    .catch(err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

伟大的!但显然,@pathurs 方式也有效:

function requestWrapper(url) {
        return request(url)
            .then(data => {...})
            .catch(err => Promise.reject(err));
    }
    requestWrapper('http://some-url.com')
        .then(data => {...}, err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

我不明白这是一个本机功能,还是request库的一些补充: https: //github.com/request/request-promise#thenonfulfilled-onrejected