基础

Promise

  • 抽象表达:是js中进行异步编程的新的解决方案
  • 具体解释:1、从语法上来说是一个构造函数 2、从功能上来说promise对象用来封装一个异步操作并可以获取其结果
  • 状态改变:0、new实例为pending(未知)状态 1、pending变为resolved(成功) 2、pending变为rejected(失败)

    一个promise对象只能改变一次,成功结果数据一般为value,失败结果数据一般为reason

示例代码

    const p1 =  new Promise
(
function(resolve, reject) // 这里的参数为两个处理函数,该函数称为执行器函数(执行异步任务),该函数为同步回调
{
setTimeout
(
function()
{
if(Date.now() % 2 === 0)
{
resolve('成功的数据!');
}
else
{
reject('失败的数据!');
}
},1000
)
}
)

基本使用

        var x;

        function fun1()
{
return new Promise
(
function(resolve, reject)
{
// 模拟异步任务
setTimeout
(
function()
{
console.log('get data successfully'); // 完成数据的接收,并将其处理抛出
resolve('datax');
},2000
)
}
)
} fun1().then( (value) => { x = value; console.log(x); } ); // 在回调函数内部将数据输出 // 语法糖
const p1 = Promise.resolve(1); // 构建一个产生一个成功数据为1的promise对象
const p2 = Promise.reject(0); // 构建一个产生一个失败数据为0的promise对象 p1.then( (value) => { console.log(value); } );
p2.catch( (reason) => { console.log(reason); } ); // Promise.all
const allP = Promise.all([p1, p2]); // 参数为一个包含promise对象的数据 // 对象数组中有一个promise对象返回错误就会得到错误结果,成功的数据将返回一个数组保存(顺序按照对象数组内的顺序)
allP.then( value => { console.log('onResolved') } ).catch( reason => { console.log('onRejected', reason) } ); // Promise.race 了解(结果为第一个完成的promise实例对象的结果)
Promise.race([p2, p1]).then( value => { console.log('111') } ).catch( reason => { console.log('000') } );

关键问题

  • promise实例对象返回的新promise的结果由指定的对应的回调函数的执行结果来决定

    • 详细解释:

      • 如果抛出异常,新的promise状态为rejected,reason为抛出的异常
      • 如果返回值为任意非promise的值,新的promise状态变为resolved,value的值为返回的值
      • 若返回值为一个新的promise,则该promise的结果就会称为新promise的结果

代码示例

        new Promise
(
function(resolve, reject)
{
resolve('正确的输出结果');
}
).then(value => {console.log('value1', value); return 111;}, reason => {console.log('reason1', reason)}).then(value => {console.log('value2', value)}, reason => {console.log('reason1', reason)});

关键问题2

  • 成功或者失败的回调是异步的

  • 执行器函数内部的内容是同步执行(关键!)

代码示例

        new Promise(
function(resolve, reject){
setTimeout(
function(){
resolve('成功返回的数据');
console.log('这是resolve语句后的内容');
}
)
}
).then(value => {console.log(value)}).catch(reason => {console.log(reason)});

异常穿透

示例代码

        new Promise
(
function(resolve, reject)
{
reject('onRejected');
}
).then
(
value => { console.log('value1', value) },
// reason => { console.log('reason1', reason) } // 若不传入失败的回调函数,相当于 reason => {throw reason}
).then
(
value => { console.log('value2', value) },
// reason => { console.log('reason1', reason) }
).then
(
value => { console.log('value3', value) },
// reason => { console.log('reason1', reason) }
).catch
(
reason => { console.log('reason', reason); return new Promise( ()=>{} ); } // 返回一个pending状态的promise实例对象终止链式调用
).then
(
value => { console.log('value4', value) },
reason => { console.log('reason4', reason) }
)

宏队列与微队列(补充)

  • 宏队列:dom事件回调、ajax回调、定时器回调
  • 微队列:promise回调、mutation回调
  • 注意!:在执行每个宏任务前,都要将微任务执行完

示例代码

        setTimeout(function(){
console.log('延迟定时器1');
Promise.resolve('promise3').then(value => {console.log(value)});
},0); setTimeout(function(){
console.log('延迟定时器2');
},0); Promise.resolve('promise1').then(value => {console.log(value)}); Promise.resolve('promise2').then(value => {console.log(value)});

Promise核心基础的更多相关文章

  1. Androd核心基础01

    Androd核心基础01包含的主要内容如下 Android版本简介 Android体系结构 JVM和DVM的区别 常见adb命令操作 Android工程目录结构 点击事件的四种形式 电话拨号器Demo ...

  2. css核心基础总结篇

    今日这篇是整合前面的css补充知识的. 我觉得前面的关于css的知识补充进去有点乱,今日整理整理一下. 层叠样式表 层叠是什么意思?为什么这个词如此重要,以至于要出现在它的名称里. 层叠可以简单地理解 ...

  3. Android应用的核心基础

    Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...

  4. C#核心基础--类(2)

    C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...

  5. (1) css的核心基础

     css的核心基础 1.css的基本语法在具体使用css之前,请各位兄弟姐妹先思考一个生活中的问题,一般情况下我们是如何描述一个人的呢? 小明{ 民族:汉族: 性格:温柔: 性别:男: 体重:68kg ...

  6. Servlet---JavaWeb技术的核心基础,JavaWeb框架的基石(一)

    初学JavaWeb开发,请远离各种框架,从Servlet开始.         Web框架是开发者在使用某种语言编写Web应用服务端是关于架构的最佳实践.很多Web框架是从实际的Web项目抽取出来的, ...

  7. CSS 设计彻底研究(一)(X)HTML与CSS核心基础

    第1章 (X)HTML与CSS核心基础 这一章重点介绍了4个方面的问题.先介绍了 HTML和XHTML的发展历程以及需要注意的问题,然后介绍了如何将CSS引入HTML,接着讲解了CSS的各种选择器,及 ...

  8. JavaScript编程:javaScript核心基础语法

    1.javaScript核心基础语法: javaScript技术体系包含了5个内容:          1.核心语言定义:          2.原生对象和雷子对象:          3.浏览器对象 ...

  9. 一个都不能少: DevOps的3大核心基础架构

    DevOps的涵盖面非常广,因为这个概念的火热,又有很多文章和技术都在把DevOps的帽子扣在自己头上,让很多人迷惑不解.其实,DevOps的知识体系如果从顶层上来分解,只有2块:方法论和工具链.方法 ...

随机推荐

  1. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  2. SQL注入笔记-updatexml与extractvalue

    0x1介绍 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数 EXTRACTVALUE(XML_document, XPath_string); UPDATEXML(XML_docu ...

  3. day05总结

    """ echo  "了不起的 [陈少] " 输出结果:   了不起的陈少! ! ! """ ""& ...

  4. MCU 51-4 独立按键&编码按键

    独立按键: 按键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动的过程,抖动必须清除. 按键按下一次,数码管数值加1: #include<re ...

  5. Linux05 /nginx

    Linux05 /nginx 目录 Linux05 /nginx 1. nginx安装.配置 2. nginx的多虚拟主机功能 3. nginx的访问日志功能,404页面功能 4. nginx的反向代 ...

  6. WPF在.NET 5 中的线路图

    WPF是用于构建Windows桌面应用程序的.NET Core UI框架.WPF的所属权最近已经移交给了我们的团队(Windows下开发生态系统和平台的团队).这种转变使跨UI框架(即WinUI和WP ...

  7. express中是如何处理IP的?

    express获取client_ip req.ip // 获取客户端ip req.ips // 获取请求经过的客户端与代理服务器的Ip列表 查看源码 定义获取ip的入口, // 源码 request. ...

  8. CentOS8.0 Docker Repository

    一.硬件软件准备      1.2台服务器或者电脑(使用云服务器1.阿里云 2.百度云各一台) ,系统均为CentOS 8.0      2.分别安装Docker      3.测试镜像准备(准备的是 ...

  9. Codeforces1379-题解

    很久以前,申蛤申请了一个cf号叫 wzxakioi 有一天,戌蛤带着申蛤用这个账号打了一场div3,然后它的rating超过了shzr 之后申蛤又用这个号打了三场div2,于是  CF1379C 题意 ...

  10. Maven配置文件中的版本使用-SNAPSHOT

    SNAPSHOT是什么? SNAPSHOT是快照,是一种特殊的版本,制定了某个当前的开发进度副本.不同于正式版本,Maven每次构建都会在远程仓库中检查新的快照.如此每次发布更新代码的快照到仓库中,新 ...