【发布时间】:2021-04-04 03:43:49
【问题描述】:
我对 Promise 有疑问,这让我很困惑。
.then() 方法
在我进入关于 .then() 方法让我感到困惑的事情之前,我将根据我的知识对 Javascript 引擎的工作原理做一个简短的解释。
据我所知,Javascript 不是异步语言,而是同步语言
Javascript 引擎同步工作,但 Javascript 引擎并不是浏览器上唯一运行的东西
Javascript 引擎可以在 当我们调用原生函数时与它们对话
setTimeout
所以setTimeout 函数将调用Javascript引擎之外的程序进行计时
当然,当计时器结束时,它会将回调发送到事件队列,并且只有在 Javascript 完成所有 Executions 上下文之后,它才会查看事件队列
好的,现在让我们转到 Promise
我的问题是.then() 如何知道何时调用resolve()
我读过文章,他们说.then() 异步工作,这对我来说听起来很奇怪,因为 Javascript 是同步的,不是吗?
也许我没有正确理解它们
所以我对.then() 的工作原理做出了自己的假设,因为我还没有找到让我感觉和自信我确切知道.then() 工作原理的来源。
其中一个(我的假设)是.then 方法中有两个阶段
我将使用此代码进行演示来解释我的假设
var myPromise = new Promise(function(resolve){
resolve('Hello Stackoverflow !');
});
myPromise.then(function(result){
console.log(result);
});
所以根据我的假设 resolve('Hello Stackoverflow !') 函数调用 .then 方法和
.then这里检查两件事如下
1..then()的回调参数是否被创建
2.如果 Promise 状态设置为已解决
如果两个条件都为真,那么.then() 方法会将带有值Hello Stackoverflow ! 的回调插入到事件队列中,并且只有在堆栈中弹出所有执行上下文之后,它才会运行回调,我们将得到结果Hello Stackoverflow !
这又是仅基于我的假设也许我完全错了。
因此,如果您检查我刚才所说的内容,您可以得出这样的结论:.then 方法被调用了两次
为什么?
第一次是当解析函数调用它但并非所有条件都为真时
不正确的是 .then 回调参数已创建但尚未创建
因为我们还没有到我们创建回调的代码行,所以条件为假
第二次是当我们调用.then 方法并创建回调并且所有条件现在都为真时,它会将回调插入事件队列,并且在所有执行上下文将弹出堆栈然后回调将被调用
我们会得到Hello Stackoverflow !
希望你能理解我试图解释的内容
我是对还是错?
提前感谢大家:)
【问题讨论】:
-
.then()方法在myPromise初始化后立即被调用。.then()方法和传递给.then()的 callback 是两个完全不同的东西。 -
使用 Promises 安排的回调不会添加到任务队列中 - 它们是 added to the micro-task queue。
-
"如果两个条件都为真,[它] 会将带有值的回调插入到事件队列中" - 是的。但是如果 promise 还没有实现,
then方法只是将回调存储在一个内部列表中,以便通过resolve调用将其放入事件队列中。 -
我可以建议阅读相同主题的答案。
-
由于一些奇怪的原因,我们似乎错过了现在成为 Js 引擎一部分的 WEB API 的概念,这是一篇非常好的文章,因为通过 web API 承诺在幕后发生的事情是 web 线程池的一部分使异步操作的 API dev.to/steelvoltage/…
标签: javascript promise