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