[英]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 拒绝,将会失败。 在同步代码中,这相当于未捕获的抛出错误。 直到现在(-ish)未捕获的 promise 拒绝被容忍,但没有一个很好的理由。 Node 正在努力将它们与冒泡到顶部的任何其他错误一样对待。
您正在考虑仅使用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();
}
Await 停止async
function(因此也停止等待函数的任何内容)但无论如何都不影响事件循环。
据我目前了解,创建 promise 后开始运行。
它不是。 它的内部 state 设置为pending
。 Promise 的构造函数将回调作为参数,然后为其提供resolve
和reject
回调。
它还可以做的是,它允许提供一些在 state 更改为resolved
或rejected
时发生的操作。 在async/await
之外,您可能知道它们是Promise
class 的.then
和.catch
实例方法。一旦 state 被更改,它们将被执行。
如果代码中未使用从 promise 返回的值,我是否需要等待 promise?
不,这完全取决于你。
一个场景是:假设我正在我的系统中处理一个任务,我想将信息记录到 mongodb,当我调用插入 function 时,我得到一个 promise。 处决存在但我不在乎它的结果
如果我不等待并且出现错误,我将无法处理它。
您仍然可以使用.catch
来处理错误,而无需等待Promise
完成
上述问题的后续问题:
从我每次等待时读到的内容来看,它实际上阻止了异步 function 的执行,但是如果它阻止了 function 的执行,它怎么不阻止事件循环的 rest?
Promises 与事件循环无关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.