繁体   English   中英

澄清 javascript 中的承诺

[英]clarification about promises in javascript

我对有关承诺的某些部分感到困惑,我阅读了多篇文章并且看过多个视频,我想问几件事:

据我目前了解,创建 promise 后开始运行。

如果代码中未使用从 promise 返回的值,我是否需要等待 promise?

一个场景是:假设我正在我的系统中处理一个任务,我想将信息记录到 mongodb,当我调用插入 function 时,我得到一个 promise。 处决存在但我不在乎它的结果

如果我不等待并且出现错误,我将无法处理它。

上述问题的后续问题:

从我每次await时读到的内容来看,它实际上阻止了异步 function 的执行,但是如果它阻止了 function 的执行,它怎么不阻止事件循环的 rest?

基本概念

事件循环的全部意义在于拥有许多互不影响的微任务(因此默认情况下没有影响)。

首先链接微任务; 有回调,然后是 Promises( then是 / catch ),然后是async / await API。最后两个可以被认为只是回调概念之上的语法糖。 没有添加“功能”,而是使用不同的语法以更简单和更优雅的方式实现相同的东西(Pyhilosophicaly)。

事件循环在每个循环中执行所有排队的微任务并重复。 除非您有阻塞代码(并且await不被视为阻塞),否则您的事件循环永远不会停止,因此其他任务不会受到影响。

您正在尝试从其他语言中预期的真正阻塞代码的角度来理解await

恕我直言,您首先需要深入了解回调的工作原理,然后研究 Promises(作为使回调不那么混乱的工具),然后是async / await (作为使 Promises 更漂亮的语法)。 但请记住,底层系统是相同的:调用函数的函数,这些函数得到处理的函数,最终在将来被调用)。

具体问题

创建 promise 后开始运行

是的,但不是。 一个 promise 没有运行,一个 promise 只是你通过一部分代码收到的合同,将用于通知你结果。 所以 promise 不运行,是指在您请求要执行的任务后为您创建的。

因此,通常如果 promise 已处理给您,则有一些“正在运行”。 但是Promise可能会以不同的方式使用,并且可能有一些“等待”。

promise 未链接到任务的执行,因此它无法启动或停止它。

如果我对结果不感兴趣,是否需要等待 promise

不,您不需要这样做。 但请记住,不处理 promise 异常已被弃用,可能会导致系统故障。 您应该始终处理(或冒泡)异常。

如果有未处理的 promise 拒绝,将会失败。 在同步代码中,这相当于未捕获的抛出错误。 直到现在(-ish)未捕获的 promise 拒绝被容忍,但没有一个很好的理由。 Node 正在努力将它们与冒泡到顶部的任何其他错误一样对待。

VLAZ

您正在考虑仅使用async / await的承诺,但底层Promise api 是 .then .then().catch() 使用这个 API 你可以以“即发即弃”的方式使用承诺:

async function Do() {
  await before();
  asyncDbCall().catch(err => console.error(err))
  await after();
}

在此示例中,您没有等待asyncDbCall() ,但.catch(err => console.error(err))仍然会导致错误被记录(在将来的某个时间,甚至可能在Do()完成之后)。

或者您可以将执行分支到其他异步执行,以这个复杂的例子为例:

async function Do() {
    await before();
    // This will execute AFTER before() & only if before() succeeded
    asyncDbCall()
        .then(async value => {
            // This will execute after `asyncDbCall()` and only if it succeeded
            await something(value);
            // We reach here after `something()` and only if succeeded
        })
        .catch(err => {
            // This will execute if `asyncDbCall()` fails of IF ANYTHING
            // within `async value => {}` fails
            console.error(err);
        })
    // This will execute AFTER before() and only if before() succeeded and
    // asyncDbCall() call (but not Promise) succeeded
    await after();
}

等待它实际上阻止了异步 function 的执行

Await 停止async function(因此也停止等待函数的任何内容)但无论如何都不影响事件循环。

据我目前了解,创建 promise 后开始运行。

它不是。 它的内部 state 设置为pending Promise 的构造函数将回调作为参数,然后为其提供resolvereject回调。

它还可以做的是,它允许提供一些在 state 更改为resolvedrejected时发生的操作。 async/await之外,您可能知道它们是Promise class 的.then.catch实例方法。一旦 state 被更改,它们将被执行。

如果代码中未使用从 promise 返回的值,我是否需要等待 promise?

不,这完全取决于你。

一个场景是:假设我正在我的系统中处理一个任务,我想将信息记录到 mongodb,当我调用插入 function 时,我得到一个 promise。 处决存在但我不在乎它的结果

如果我不等待并且出现错误,我将无法处理它。

您仍然可以使用.catch来处理错误,而无需等待Promise完成

上述问题的后续问题:

从我每次等待时读到的内容来看,它实际上阻止了异步 function 的执行,但是如果它阻止了 function 的执行,它怎么不阻止事件循环的 rest?

Promises 与事件循环无关。

您可以在此处阅读有关 EventLoop 的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM