大家好!
我使用Node.js v8.5.0。 这是我在Node.js(简化)中的代码:
// function that returns promise
const request = (url) =>
new Promise((resolve, reject) => {
superagent
.get(url)
.end((err, res) => {
if (err || !res.ok) {
reject(err);
return;
}
resolve(res);
})
})
// function that add .then and .catch to promise
const to = promise =>
promise
.then((data) => [null, data])
.catch((err) => [err]);
// making request
let [err, result] = await to(request());
当我提出请求并且发生了一些错误时 .catch 函数没有捕获被拒绝的值,我收到错误,如未处理的承诺拒绝。 但是,实际上我添加了 .catch 功能来承诺。
有谁知道这里有什么问题吗? 感谢帮助!
答案 0 :(得分:2)
superagent请求已经返回一个promise,所以请改用
const request = (url) => superagent.get(url).then(res=> {/*transform res**/ return res})
答案 1 :(得分:0)
您提供的代码没有这种行为,但我熟悉未承诺的承诺警告。
如果你想在以后捕获一个承诺的错误,你必须先捕获它并在你捕获之前返回承诺。
以下内容将为您提供未承诺的警告:
var failPromise = val => Promise.reject(val);
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]);
var p = failPromise(88);
//later you will catch the error
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100);
但是如果你稍微改变它,你就不会
var failPromise = val => {
const p = Promise.reject(val);
p.catch(ignore=>ignore);
return p;//return the promise that did not have the catch
};
var to = async promise => promise.then(val=>[null,val]).catch(err=>[err]);
var p = failPromise(88);
//later you will catch the error
setTimeout(()=>to(p).then(val=>console.log("resolved to:",val)),100);
如前所述;你的请求方法应该只返回superagent返回的promise,但是这样你可以在没有错误的情况下捕获拒绝(警告):
const request = (url) => {
const p = superagent
.get(url);
p.catch(ignore=>ignore);
return p;
})
如果你想知道为什么你没有承诺;这是因为你捕获队列中的拒绝而不是堆栈中的拒绝。堆栈和队列解释为here。
在堆栈中捕获的示例在控制台中没有导致错误,但随后返回没有捕获的promise。根据您要捕获它的队列中的距离,它可能仍然会给您错误,但在提供的代码中它不会。