基础

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. Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  2. python入门005

    垃圾回收机制详解(了解) 1.引用计数 x = 10 # 直接引用 print(id(x)) y = x z = x l = ['a', 'b', x] # 间接引用 print(id(l[2])) ...

  3. Redux的理解与使用

    一.什么是Redux? Redux是一个第三方状态管理的js库,它不仅仅可以适用于react框架,还可以用于其他的vue,auglar等框架.只不过react的生态中不包括一个状态管理的库而已,所以与 ...

  4. day13 函数入门

    目录 一.什么是函数 二.为何要有函数 三.如何用函数 1.定义函数的三种形式: 形式一.无参函数(自身能干活) 形式二.有参函数(需要外部的材料来加工) 形式三.空函数(在写框架构思函数的时候) 2 ...

  5. C#中关于Task.Yeild()的探究

    在与同事讨论async/await内部实现的时候,突然想到Task.Yeild()这个函数,为什么呢,了解一点C#async/await内部机制的都知道,在await一个异步任务(函数)的时候,它会先 ...

  6. PHP使用array_filter查找二维数组中符合字段和字段值的数据集合

    1.方法: /** * 获取符合字段和字段值的数组集合 * @param array $data 待过滤数组 * @param string $field 要查找的字段 * @param $value ...

  7. Django setting设置 常用设置

    目录 Django配置文件基本设置 前言 setting配置汇总 一.APP路径 二.数据库配置 三.sql语句展示 四.静态文件目录 五.media文件配置 六.数据库中的UserInfo(用户表) ...

  8. node+express实现简单的增删改查

    var express = require('express'); var bodyParser = require("body-parser"); var cors = requ ...

  9. Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板

    场景 我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整 ...

  10. 使用Typora写博客,图片即时上传,无需第三方图床-EasyBlogImageForTypora

    背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...