当前位置: 首页 > 知识库问答 >
问题:

为什么javascript ES6promise在解析后继续执行?

东方方伟
2023-03-14

据我所知,promise是可以解析()或拒绝()的东西,但我惊讶地发现,promise中的代码在调用解析或拒绝后仍继续执行。

我认为resolve或reject是exit或return的异步友好版本,它将停止所有立即的函数执行。

有人能解释一下为什么下面的示例有时在解析调用后显示console.log的背后思想吗:

var call = function() {
    return new Promise(function(resolve, reject) {
        resolve();
        console.log("Doing more stuff, should not be visible after a resolve!");
    });
};

call().then(function() {
    console.log("resolved");
});

杰斯宾

共有3个答案

姜烨伟
2023-03-14

resolve()函数与return完全不同。它只是表示用then()方法注册的回调函数的参数现在已准备就绪,回调函数可能会离开作业队列(或微任务队列)并进入主JS调用堆栈,但是,只有当所有同步代码和异步代码在队列结束运行之前进入队列时,才会发生这种情况console.log(“在返回语句后不执行更多操作”) 代码中的此语句是同步代码,它具有优先级或异步代码。这就是为什么它首先运行

吕承福
2023-03-14

规范仍然要求异步调用解析promise时调用的回调。这是为了确保在混合使用同步和异步操作的promise时的一致行为。

因此,当您调用解决时,回调将排队,并且函数执行将立即继续执行解决()调用之后的任何代码。

只有当JS事件循环获得控制权后,才能从队列中删除回调并实际调用。

甄华清
2023-03-14

JavaScript具有“运行到完成”的概念。除非抛出错误,否则函数将一直执行,直到到达return语句或其结束。函数之外的其他代码不能对此进行干扰(除非再次抛出错误)。

如果你想退出初始化函数,你必须在它前面加上:

return new Promise(function(resolve, reject) {
    return resolve();
    console.log("Not doing more stuff after a return statement");
});
 类似资料:
  • 我正在运行以下代码,试图删除不存在的“尖叫”: 控制台日志显示以下内容: 我希望函数在404响应时停止执行,但似乎块都是在block之外执行的。为什么会这样?

  • 在一些请求中,我们会做一些日志的推送、用户数据的统计等和返回给终端数据无关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。 这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。 怎么做到呢?我们先看其中的一种方法: local response

  • 问题内容: 我正在尝试引发异常(不使用try catch块),并且程序在引发异常后立即完成。有没有一种方法可以在我引发异常之后继续执行程序?我抛出了在另一个类中定义的InvalidEmployeeTypeException,但是我希望程序在抛出该异常后继续执行。 问题答案: 试试这个:

  • 本文向大家介绍深入剖析浏览器退出之后php还会继续执行么,包括了深入剖析浏览器退出之后php还会继续执行么的使用技巧和注意事项,需要的朋友参考一下 前提:这里说的是典型的lnmp结构,nginx+php-fpm的模式 如果我有个php程序执行地非常慢,甚至于在代码中sleep(),然后浏览器连接上服务的时候,会启动一个php-fpm进程,但是这个时候,如果浏览器关闭了,那么请问,这个时候服务端的这

  • C# 用try catch包起来执行后继续报错 尝试过异步但效果不太好