You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从头开始创建的自定义JavaScript Promise中,“'Then'在Promise解析之前被执行。这是什么原因?”

在自定义的JavaScript Promise中,'then'在Promise解析之前被执行的原因是因为'Promise'的构造函数中的执行代码是同步执行的,而'then'方法是异步执行的。

以下是一个展示这个问题的简单代码示例:

class MyPromise {
  constructor(executor) {
    this.state = 'pending';
    this.value = undefined;
    this.callbacks = [];

    const resolve = (value) => {
      if (this.state === 'pending') {
        this.state = 'fulfilled';
        this.value = value;
        this.callbacks.forEach(callback => this.executeCallback(callback));
      }
    };

    executor(resolve);
  }

  then(callback) {
    if (this.state === 'fulfilled') {
      this.executeCallback(callback);
    } else {
      this.callbacks.push(callback);
    }
  }

  executeCallback(callback) {
    setTimeout(() => {
      const result = callback(this.value);
      // 处理then方法返回的新Promise
      if (result instanceof MyPromise) {
        result.then(value => console.log('Resolved:', value));
      } else {
        console.log('Resolved:', result);
      }
    }, 0);
  }
}

// 创建一个自定义Promise对象实例
const myPromise = new MyPromise((resolve) => {
  console.log('Promise is being resolved...');
  setTimeout(() => {
    resolve('Promise resolved');
  }, 1000);
});

// 在Promise解析之前调用then方法
myPromise.then(value => console.log('Then:', value));

在上面的代码中,当创建MyPromise对象实例时,构造函数中的executor函数会立即执行,在这个例子中,执行了一个异步操作setTimeout。然后,在构造函数内部,调用resolve函数解析Promise。

由于setTimeout是异步执行的,所以会先执行then方法,将callback函数添加到callbacks数组中,然后执行executeCallback函数。在executeCallback函数中,我们使用setTimeout来模拟异步操作,以确保在then方法之后执行。

这样,当Promise被解析时,callbacks数组中的callback函数将被依次执行,并输出结果。

在上面的代码示例中,我们创建了一个自定义的Promise对象实例myPromise,然后在Promise对象解析之前调用then方法。根据代码的输出,我们可以看到在Promise解析之前,then方法已经被执行了。

这就是为什么在自定义Promise中,'then'在Promise解析之前被执行的原因。为了解决这个问题,我们可以使用setTimeout或其他异步操作来确保'then'方法在Promise解析之后被执行。

本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

漫谈开源许可证:开发者需要知道的法理和事例

=&rk3s=8031ce6d&x-expires=1715790041&x-signature=oxeAMC3A39GTUQ7VUMkev6%2Bkxsc%3D)当我们在说 **开源许可证** 的时候,其实我们在说的是这些当中的 **宽松许可** 和 **Copyleft 互惠性条款** : ... 整个程序的源代码发布要求也不包含这些系统库,即使你发布的是连接了这些库之后的可执行文件也是一样。 **> 依赖包**ffmpeg.wasm 项目是 FFmpeg 的 WebAssembly / JavaScript 移植版本。它可以在浏览器内实...

应用性能前端监控,字节跳动这些年经验都在这

这个指标上报视口中可见的最大图像或文本块的渲染的时间点,为了提供良好的用户体验,LCP 分数最好保证在 **2.5 秒**以内。**[First Input Delay (FID)](https://web.dev/fid/)**第一次输入延迟,用于测量**可交互性**。FID 衡量的是从用户第一次与页面交互(例如,当他们点击链接,点击按钮,或使用自定义的 JavaScript 驱动的控件)到浏览器实际能够开始响应该交互的时间,为了提供良好的用户体验,站点应该努力使 FID 保持在 **100 ...

封装一个ReactNative列表状态管理,对比hook和class的区别|社区征文

(在react也是同样可以使用),分别用hooks的方式和class的方式实现,也会讲解依赖倒置的好处## ReactNativeReact Native,是一款由Facebook开源的移动应用开发框架,使用JavaScript来开发安卓和IOS应用环境搭建就跟着官网来就好了 https://reactnative.dev/docs/environment-setup我们这里选择用Typescript的模板```npx react-native init AwesomeTSProject --template react-native-template-typescript```## 定义列表模...

富媒体在客服IM消息通信中的秒发实践

return new Promise((resolve, reject) => { getFileInfo(file) .then(fileReader => { const target = fileReader.target.result if (/video/g.test(file.type)) { const ... 如果这个过程能通过异步去实现,那就很完美了。JS虽然是单线程,但是浏览器提供了Web Worker的能力,让JS也能通过异步的方式和主线程进行通信。首先对比下浏览器主线程执行和主子线程执行的区别,如下图所示:![pictu...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

从头开始创建的自定义JavaScript Promise中,“'Then'在Promise解析之前被执行。这是什么原因?”-优选内容

漫谈开源许可证:开发者需要知道的法理和事例
=&rk3s=8031ce6d&x-expires=1715790041&x-signature=oxeAMC3A39GTUQ7VUMkev6%2Bkxsc%3D)当我们在说 **开源许可证** 的时候,其实我们在说的是这些当中的 **宽松许可** 和 **Copyleft 互惠性条款** : ... 整个程序的源代码发布要求也不包含这些系统库,即使你发布的是连接了这些库之后的可执行文件也是一样。 **> 依赖包**ffmpeg.wasm 项目是 FFmpeg 的 WebAssembly / JavaScript 移植版本。它可以在浏览器内实...
FetchEvent
请求上下文会自动被回收。如果你的Promise中没有使用await关键字,那么存在一种风险,即Promise可能在请求上下文被回收之前尚未执行完成。 常见用法waitUntil中注册的 Promise 受运行时资源限制。 waitUntil可以被多次嵌套使用。 waitUntil的默认行为是在所有注册的 Promise 中,如果有任何一个被拒绝,那么waitUntil依然会提前终止请求上下文,您可以通过包装 Promise ,捕获其异常来规避该行为。 示例JavaScript // 定义上传日志的U...
应用性能前端监控,字节跳动这些年经验都在这
这个指标上报视口中可见的最大图像或文本块的渲染的时间点,为了提供良好的用户体验,LCP 分数最好保证在 **2.5 秒**以内。**[First Input Delay (FID)](https://web.dev/fid/)**第一次输入延迟,用于测量**可交互性**。FID 衡量的是从用户第一次与页面交互(例如,当他们点击链接,点击按钮,或使用自定义的 JavaScript 驱动的控件)到浏览器实际能够开始响应该交互的时间,为了提供良好的用户体验,站点应该努力使 FID 保持在 **100 ...
CronEvent
该名称的设置可以通过控制台UI或者OpenAPI完成 常见用法text()该方法返回一个Promise,Promise被resolve之后,返回cron事件客户传入的数据payload,类型为JavaScript的字符串对象。注意,客户的payload必须用UTF-8编... 类型为JavaScript的ArrayBuffer对象。 stream()该方法返回一个ReadableStream对象 json()该方法返回一个Promise,Promise被resolve之后,返回cron事件客户传入的数据payload,并解析为JSON。

从头开始创建的自定义JavaScript Promise中,“'Then'在Promise解析之前被执行。这是什么原因?”-相关内容

React Native SDK 集成与埋点

预置事件也不会被采集。 2.1 获取appid在开始集成前,首先需要在集团中拥有一个应用,请参考:(如何创建应用)。「应用列表」-> 接入应用的「详情」->「应用ID」中可查看您的appid。 2.2 获取数据上送地址私有化部署版... 4.2 事件公共属性如需在每个事件中都包括某属性,可通过公共属性设置,无需在每个事件中重复设置。公共属性只需设置一次,即可包括在所有代码埋点事件中。 4.2.1 设置公共属性关于自定义 “公共属性” 请注意: 上报机...

React Native SDK 集成与埋点

预置事件也不会被采集。 2.1 获取appid在开始集成前,首先需要在集团中拥有一个应用,请参考:(如何创建应用)。「应用列表」-> 接入应用的「详情」->「应用ID」中可查看您的appid。 2.2 获取数据上送地址私有化部署版... 4.2 事件公共属性如需在每个事件中都包括某属性,可通过公共属性设置,无需在每个事件中重复设置。公共属性只需设置一次,即可包括在所有代码埋点事件中。 4.2.1 设置公共属性关于自定义 “公共属性” 请注意: 上报机...

React Native SDK 集成与埋点

之前已经获得用户授权。合规建议操作如下:用户授权后再进行SDK的初始化,取得用户授权前所有的信息都不会采集,预置事件也不会被采集。 2.1 获取appid在开始集成前,首先需要在集团中拥有一个应用,请参考:(如何创建应... 4.2 事件公共属性如需在每个事件中都包括某属性,可通过公共属性设置,无需在每个事件中重复设置。公共属性只需设置一次,即可包括在所有代码埋点事件中。 4.2.1 设置公共属性关于自定义 “公共属性” 请注意:1. 上报...

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

接入指引

已完成 Web 类型应用创建并获取 AppID。 引入依赖CDN 方式引入通过 CDN 方式引用播放器的脚本和样式文件。 在项目工程中新建 index.html 文件。 引入以下播放器的 CSS 样式文件和 JavaScript 脚本文件。 html NPM 方式引入安装播放器依赖包和播放器插件依赖包。 bash npm install @volcengine/veplayernpm install @volcengine/veplayer-plugin 引入播放器依赖包及依赖包样式。 js import { createLivePlayer, register } from...

封装一个ReactNative列表状态管理,对比hook和class的区别|社区征文

(在react也是同样可以使用),分别用hooks的方式和class的方式实现,也会讲解依赖倒置的好处## ReactNativeReact Native,是一款由Facebook开源的移动应用开发框架,使用JavaScript来开发安卓和IOS应用环境搭建就跟着官网来就好了 https://reactnative.dev/docs/environment-setup我们这里选择用Typescript的模板```npx react-native init AwesomeTSProject --template react-native-template-typescript```## 定义列表模...

SDK 概览

即点即用在云机执行的应用,以更高性价比执行多类计算任务。 SDK 下载客户端SDK 包文件开发者文档AndroidAndroid SDK 文档iOSiOS SDK 文档Web/H5Web/H5 SDK 文档WindowsWindows SDK 文档相关信息SDK 隐私政策:云手机 SDK 隐私政策 开发者使用合规规范:云手机 SDK 开发者使用合规规范 版本发布说明V1.39.0 (2024/3/27)云手机客户端 SDK V1.39.0 的发布说明如下: Android 新增 sendShakeEventToRemote 接口透传客户端“摇一摇”指令...

小游戏SDK集成

首先需要在集团中拥有一个应用,请参考:快速入门:管理员(SaaS)在集团中接入应用。 「应用列表」-> 接入应用的「详情」->「应用ID」中可查看您的appid。 2.2 初始化SDK示例 2.2.1 SaaS业务javascript // 在入口页面初... 会自动上报预定义事件,如app_launch、app_terminate等事件 ab实验 enable_ab_test boolean 设置true后,会开启ab实验功能,包括使用getVar、getAllVars等api ab_channel_domain string 可以自定义ab实验域名,...

小游戏SDK集成

首先需要在集团中拥有一个应用,请参考:快速入门:管理员(SaaS)在集团中接入应用。 「应用列表」-> 接入应用的「详情」->「应用ID」中可查看您的appid。 2.2 初始化SDK示例 2.2.1 SaaS业务javascript // 在入口页面初... 会自动上报预定义事件,如app_launch、app_terminate等事件 ab实验 enable_ab_test boolean 设置true后,会开启ab实验功能,包括使用getVar、getAllVars等api ab_channel_domain string 可以自定义ab实验域名,...

小游戏SDK集成

首先需要在集团中拥有一个应用,请参考:快速入门:管理员(SaaS)在集团中接入应用。 「应用列表」-> 接入应用的「详情」->「应用ID」中可查看您的appid。 2.2 初始化SDK示例 2.2.1 SaaS业务javascript // 在入口页面初... 会自动上报预定义事件,如app_launch、app_terminate等事件 ab实验 enable_ab_test boolean 设置true后,会开启ab实验功能,包括使用getVar、getAllVars等api ab_channel_domain string 可以自定义ab实验域名,...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询