Promise.resolve()详解菜鸟知识_Promise小白知识

Promise.resolve等价于下面的写法有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。Promise.resolve(‘foo’)
// 等价于
new Promise(resolve => resolve(‘foo’))Promise.resolve方法的参数分成四种情况参数是一个 Promise 实

Promise.resolve()详解菜鸟知识

Promise.resolve等价于下面的写法

有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。

Promise.resolve()详解菜鸟知识_Promise小白知识

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

Promise.resolve方法的参数分成四种情况

参数是一个 Promise 实例

如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。

参数是一个thenable对象

thenable对象指的是具有then方法的对象,比如下面这个对象

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

Promise.resolve方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then方法。

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

let p1 = Promise.resolve(thenable);
p1.then(function(value) {
  console.log(value);  // 42
});

thenable对象的then方法执行后,对象p1的状态就变为resolved,从而立即执行最后那个then方法指定的回调函数,输出 42

参数不是具有then方法的对象,或根本就不是对象

如果参数是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved。

const p = Promise.resolve('Hello');

p.then(function (s){
  console.log(s)
});
// Hello

由于字符串Hello不属于异步操作(判断方法是字符串对象不具有 then 方法),返回 Promise 实例的状态从一生成就是resolved,所以回调函数会执行。Promise.resolve方法的参数,会同时传给回调函数

不带有任何参数

Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。

setTimeout(function () {
  console.log('three');
}, 0);

Promise.resolve().then(function () {
  console.log('two');
});

console.log('one');

// one
// two
// three

.then()函数里不返回值或者返回的不是promise,那么 then 返回的 Promise 将会成为接受状态(resolve)

Promise.resolve().then(() => console.log(2)).then(() => console.log(3));
console.log(1); // 1, 2, 3

需要注意的是,立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时执行执行,不是马上执行,也不是在下一轮“事件循环”的开始时执行

原因:传递到 then() 中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在 JavaScript 事件队列的所有运行时结束了,事件队列被清空之后,才开始执行

resolve()本质作用

  • resolve()是用来表示promise的状态为fullfilled,相当于只是定义了一个有状态的Promise,但是并没有调用它;
  • promise调用then的前提是promise的状态为fullfilled;
  • 只有promise调用then的时候,then里面的函数才会被推入微任务中;
海计划公众号
(1)
上一篇 2020/03/23 18:37
下一篇 2020/03/23 18:37

您可能感兴趣的内容

  • HTML 注释 和 实体字符小白攻略_注释入门知识

    一、注释在HTML中还有一种特殊的标签——注释标签。如果需要在HTML文档中添加一些便于阅读和理解但又不需要显示在页面中的注释文字,就需要使用注释标签。注释内容不会显示在浏览器窗口中,但是作为HTML文档内容的一部分,也会被下载到用户的计算机上,查看源代码时就可以看到。语法:Tips:在 sublime 工具上注释的快捷键是 ctr

    2020/04/05
  • PHP微服务集群搭建基础教程_微服务菜鸟教程

    近些年微服务架构大行其道,趁着最近有时间,来捣鼓捣鼓微服务是怎么一回事。微服务架构微服务的概念由 Martin Fowler 于2014年3月提出:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务和服务之间采用轻量级的通信机制相互沟通。每个服务都围绕着具体的业

    2020/03/26
  • 知笔墨小白基础Markdown格式与Git版本控制工具来进行图书的编写、构建与发布工作

    知笔墨小白常识 官方网址:http://zhibimo.com/ 简介描述:Markdown格式与Git版本控制工具来进行图书的编写、构建与发布工作 使用Markdown格式与Gi…

    2020/03/06
  • 微订阅使用帮助_桌面版微信公众号订阅利器

    微订阅使用帮助 官方网址:http://getelastic.cn/werss/ 简介描述:桌面版微信公众号订阅利器 「微订阅」是一款支持苹果电脑和windows系统的微信公众号R…

    2020/03/11
  • 解决图片上传File对象不兼容IE使用攻略_上传入门基础

    最近做公司业务, 上传图片出问题了~首先是要求前端传递的图片名称不能是中文 ?解决办法: 我们讨论决定以时间戳命名new File([file], new Date().getTime() + ‘.’ + 文件后缀名 ,{ type: file.type });问题又来了, new File在ie下报错,也就是说在ie下调用上传图片功能是无效的解决办法: F

    2020/03/22
  • javascript是编译型还是解释型?基础指南_语言攻略教程

    javascript是解释型的,是直译式脚本语言。javascript是不需要编译的,浏览器直接解释源代码,并执行在内存中创建变量等操作。什么是编译型?编译型语言是把源代码先编译为机器码(也就是所谓的可执行程序,比如windows系统的exe文件),运行的时候电脑只需直接把机器码交给CPU执行即可。编译型语言的特点是运行速度快,效率高。缺点是可移植性差。什么

    2020/03/22
  • NodeJS模块os使用指南_模块使用说明

    读了 os 模块的文档,研究了几个有意思的问题:识别操作系统平台理解和计算“平均负载”理解和计算“cpu 使用率”理解和计算“内存使用率”查看运行时间识别操作系统平台nodejs 提供了os.platform()和os.type(),可以用来识别操作系统平台。推荐使用: os.platform()理解和计算“平均负载”平均负载是指:单位时间内,系统处于可运行

    2020/03/20
  • flex 增长与收缩入门百科_布局零基础入门

    flex:auto 将增长值与收缩值设置为1,基本大小为 auto 。flex:none. 将增长值与收缩值设置为0,基本大小为 auto 。也就是固定大小。 增长:基本大小 + 额外空间 *(增长系数 / 增长系数总和) 按比例划分额外空间,然后各自分配。 缩小:基本大小 – 溢出大小 *(缩小系数 * 基本大小 / 各各缩小系数 * 自身大小 之和

    2020/03/31
  • wechat-im菜鸟教程下载_微信小程序即时通讯模板,使用WebSocket通信

    wechat-im菜鸟教程下载 GitHub:https://github.com/unmagic/wechat-im 简介描述:微信小程序即时通讯模板,使用WebSocket通信…

    2020/03/11
  • 怎样取消 JavaScript 中的异步任务?教程视频_异步使用帮助

    怎样取消 JavaScript 中的异步任务?教程视频 有时候执行异步任务可能是很困难的,尤其是在特定的编程语言不允许取消被错误启动或不再需要的操作时。幸运的是 JavaScrip…

    2020/03/20
  • js利用递归与promise 按顺序请求数据使用帮助_递归指南攻略

    问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求是异步的,如何让请求按照tabBar的顺序进行?方案:我们可以将promise变成下一个请求,可以利用递归来实现实施://定义初始数据 requestlist就像tabBar列表let requestlist = [1,

    2020/03/26
  • DefinePlugin插件用法理解入门百科_插件使用帮助

    一、官方定义:DefinePluginDefinePlugin 允许创建一个在编译时可以配置的全局常量。这可能会对开发模式和生产模式的构建允许不同的行为非常有用。如果在开发构建中,而不在发布构建中执行日志记录,则可以使用全局常量来决定是否记录日志。这就是 DefinePlugin 的用处,设置它,就可以忘记开发环境和生产环境构建的规则。new webpack

    2020/03/23
  • nodejs内置模块有哪些?基础入门_模块小白指南

    nodejs内置模块指的是除默认提供的语法之外,提供的美容,无需下载,直接引入,引入只写名称即可。nodejs内置模块:1、path模块 :用于处理文件路径。path.normalize(路径解析,得到规范路径);
    path.join(路径合并);
    path.resolve(获取绝对路径);
    path.relative(获取相对路径)。
    ……2、un

    2020/03/22
  • 网站打开速度优化小白基础如何提高网页访问速度技巧方法总结_优化指南攻略

    网站的加载速度不仅影响着用户体验,也会影响搜索引擎的排名,在百度推出“闪电算法”以来,将网站首屏打开速度被列入优化排名行列,并明确指定打开时间为 2 秒。作为前端开发的我们需要如果来优化网站的打开速度呢?下面就整理挖掘出很多细节上可以提升性能的东西分享给大家优化网站性能的14条规则:1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CD

    2020/04/03
  • 总结Git 不同情况下撤销和如何回滚入门教程_git菜鸟知识

    撤销在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”情况一:文件被修改了,但未执行git add操作(working tree内撤销) (modify file) git checkout /.git checkout fileName
    git checkout

    2020/03/31
  • js产生随机数函数,js如何生成随机数零基础入门_随机数基础指南

    函数:/*** js产生随机数函数* n int 需要产生的随机数位数
    */
    function RndNum(n){var rnd=””;for(var i=0;i<n;i++)rnd += Math.floor(Math.random()*10);return rnd;
    }
    调用:
    //产生一个5位的随机数
    var a = RndNum(5);
    alert

    2020/03/29