Javascript 来自NodeJS的神秘未处理承诺警告
当下面的代码错误(Javascript 来自NodeJS的神秘未处理承诺警告,javascript,node.js,promise,Javascript,Node.js,Promise,当下面的代码错误(ping()拒绝它的承诺)时,我得到警告。HTTP函数似乎出错得很好。我猜,ping()本身肯定发生了什么,这在某种程度上避免了try-catch 有人能启发我吗?(这是在尝试了几次改变后实现的。) 错误是: "main.js" 137 lines, 2945 characters (node:58299) UnhandledPromiseRejectionWarning: #<Object> (node:58299) UnhandledPromiseRejecti
ping()
拒绝它的承诺)时,我得到警告。HTTP函数似乎出错得很好。我猜,ping()
本身肯定发生了什么,这在某种程度上避免了try-catch
有人能启发我吗?(这是在尝试了几次改变后实现的。)
错误是:
"main.js" 137 lines, 2945 characters
(node:58299) UnhandledPromiseRejectionWarning: #<Object>
(node:58299) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:58299) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
NodeJS 11.13.0是一种javascript结构,它将拒绝承诺转换为异常。 也就是说,
await
是处理拒绝的构造
当你写作时:
try {
pingTask = ping('8.8.8.8');
} catch (e) {
console.log(e);
}
那里没有wait
,因此没有任何东西可以将拒绝转换为异常,也没有任何方式来处理拒绝
如果要在不等待的情况下调用ping()
,则需要更明确的拒绝处理
编辑
这是一个最小的复制器:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const test = (ms, msg) => {
return new Promise((resolve, reject) => {
sleep(ms).then(reject(msg)).catch(console.log);
});
};
(async () => {
let task1;
try {
const ms = 50;
task1 = test(ms, "hey");
await sleep(ms * 2); // otherwise you don't get an error
await task1;
} catch (e) {
console.log(e);
}
})().then(console.log).catch(console.log);
(节点:12822)未处理的PromisejectionWarning:hey(节点:12822)
未处理的PromisejectionWarning:未处理的承诺拒绝。这
错误源于异步函数的内部抛出
没有拦截,或拒绝未处理的承诺
with.catch()。(拒绝id:1)(节点:12822)[DEP0018]
弃用警告:未处理的承诺拒绝被弃用。在里面
未来,未经处理的拒绝承诺将终止合同
具有非零退出代码的Node.js进程。hey未定义(节点:12822)
PromisejectionHandled警告:承诺拒绝已处理
异步(拒绝id:1)
Promise()
构造函数开始运行test()
,50毫秒后,Promise被拒绝,但没有任何东西可以将拒绝转换为异常。
如果我们移除100毫秒睡眠,那么
await
在50毫秒睡眠完成之前将其“将拒绝转换为异常”逻辑注册到承诺方式,因此当承诺在调用await
后约49毫秒被拒绝时,有一个处理程序将其转换为异常。await
是将拒绝承诺转换为异常的javascript构造。
也就是说,await
是处理拒绝的构造
当你写作时:
try {
pingTask = ping('8.8.8.8');
} catch (e) {
console.log(e);
}
那里没有wait
,因此没有任何东西可以将拒绝转换为异常,也没有任何方式来处理拒绝
如果要在不等待的情况下调用ping()
,则需要更明确的拒绝处理
编辑
这是一个最小的复制器:
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
const test = (ms, msg) => {
return new Promise((resolve, reject) => {
sleep(ms).then(reject(msg)).catch(console.log);
});
};
(async () => {
let task1;
try {
const ms = 50;
task1 = test(ms, "hey");
await sleep(ms * 2); // otherwise you don't get an error
await task1;
} catch (e) {
console.log(e);
}
})().then(console.log).catch(console.log);
(节点:12822)未处理的PromisejectionWarning:hey(节点:12822)
未处理的PromisejectionWarning:未处理的承诺拒绝。这
错误源于异步函数的内部抛出
没有拦截,或拒绝未处理的承诺
with.catch()。(拒绝id:1)(节点:12822)[DEP0018]
弃用警告:未处理的承诺拒绝被弃用。在里面
未来,未经处理的拒绝承诺将终止合同
具有非零退出代码的Node.js进程。hey未定义(节点:12822)
PromisejectionHandled警告:承诺拒绝已处理
异步(拒绝id:1)
Promise()
构造函数开始运行test()
,50毫秒后,Promise被拒绝,但没有任何东西可以将拒绝转换为异常。
如果我们删除100毫秒睡眠,那么
await
在50毫秒睡眠完成之前将其“convert rejection to exception”(将拒绝转换为异常)逻辑注册到promise(承诺)方式,因此当调用await
后约49毫秒承诺被拒绝时,会有一个处理程序将其转换为异常。当拒绝被记录时,它指向何处,确切地在拒绝之前是否记录了任何错误?我会尝试进一步减少:是什么让您认为未处理的拒绝承诺是从ping()
返回的?消息中没有这样的内容。如果使用,它可能会显示更多信息。首先更改为const webResult=wait httpsGet(URL[0])代码>和常量pingResult=等待ping('8.8.8.8')
并去掉中间的promise变量和重复的try/catch
es(它们实际上并不需要)。这可能是因为解释器没有意识到您稍后在代码中处理拒绝。@jfriend00这是我最初遇到的情况。当拒绝被记录时,它确切地指向哪里?在拒绝之前是否记录了任何错误?我会尝试进一步减少:是什么让您认为未处理的拒绝承诺是从ping()
返回的?消息中没有这样的内容。如果使用,它可能会显示更多信息。首先更改为const webResult=wait httpsGet(URL[0])代码>和常量pingResult=等待ping('8.8.8.8')
并去掉中间的promise变量和重复的try/catch
es(它们实际上并不需要)。可能是因为解释器没有意识到您稍后在代码中处理拒绝。@jfriend00这是我最初遇到的情况。因此,pingTask
是一个承诺。那项任务没有问题。然后,在代码的后面,他们执行等待pingTask
,任务被try/catch
包围,该任务具有完整的错误处理功能。我不明白你说的是什么问题。@jfriend00的答案经过编辑以详细说明这个问题。@root最初我在一行try-catch和一行var x=wait-foo()
line中包含了所有内容,这是我第一次收到警告的时候。我把它拆开,希望能缩小引起它的范围。因此,如果我理解您的解释,我仍然需要在pingTask
上调用.catch
,然后抛出,以适应当前混乱的try-catch,对吗?我想做的是运行两个t