Eit*_*ank 1 javascript node.js promise
我对有关承诺的某些部分感到困惑,我读过多篇文章,看过多个视频,我想问一些事情:
据我目前的了解,当创建承诺时就开始运行。
如果代码中未使用从承诺返回的值,我是否需要等待承诺?
一个场景是:假设我正在系统中处理一个任务,并且我想将信息记录到 mongodb,当我调用插入函数时,我会得到一个承诺。执行存在,但我不关心它的结果
如果我不等待并且出现错误,我将无法处理它。
上述问题的后续问题:
从我读到的内容来看,await它实际上阻止了异步函数的执行,但是如果它阻止了函数的执行,它怎么不会阻止事件循环的其余部分?
事件循环的重点是拥有许多互不影响的微任务(因此默认情况下没有效果)。
首先链接微任务;先是回调,然后是 Promises ( then/ catch),然后是async/ awaitAPI。最后两个可以被认为只是回调概念之上的语法糖。没有添加任何“功能”,而是使用不同的语法以更简单、更优雅的方式实现相同的东西(Pyhilosophicaly)。
事件循环在每个循环中执行所有排队的微任务并重复。除非您有阻塞代码(并且await不被视为阻塞),否则您的事件循环永远不会停止,因此其他任务不会受到影响。
await您正尝试从其他语言中预期的真实阻塞代码的角度来理解。
恕我直言,您首先需要深入了解回调是如何工作的,然后研究 Promises(作为使回调不那么混乱的工具),然后async/ await(作为使 Promises 漂亮的语法)。但请记住,底层系统是相同的:调用函数的函数得到处理函数,最终在将来调用)。
是的,但不是。承诺不会运行,承诺只是您通过部分代码收到的合同,该代码将用于通知您结果。所以 Promise 不会运行,是指在您请求执行任务后为您创建的。
因此,通常情况下,如果您已经处理了一个承诺,就会有一些“正在运行”的事情。但Promise可能会以不同的方式使用,并且可能会有一些“等待”。
Promise 与任务的执行无关,因此它无法启动或停止任务。
不,您不需要这样做。但请记住,不处理 Promise 异常已被弃用,并且可能会导致系统故障。您应该始终处理(或让冒泡)异常。
如果有未处理的承诺拒绝,就会失败。在同步代码中,这相当于未捕获的抛出错误。到目前为止,未捕获的承诺拒绝是可以容忍的,但没有一个真正好的理由。Node 正在采取行动,将它们与冒泡到顶部的任何其他错误一样对待。
您只考虑使用async/进行承诺await,但底层Promiseapi 是.then()和.catch()。使用此 API,您可以以“即发即忘”的方式使用 Promise:
async function Do() {
await before();
asyncDbCall().catch(err => console.error(err))
await after();
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,您不会等待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();
}
Run Code Online (Sandbox Code Playgroud)
Await 会停止该async函数(因此也会停止正在等待该函数的任何内容),但不会影响事件循环。
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |