Promise——介绍与基本使用

1、Promise是什么

1.1 理解

  1. 抽象表达
    Promise是一门新的技术(ES6规范)
    Promise是JS种进行异步编程的新解决方案
  2. 具体表达
    从语法上来说,promise是一个构造函数;
    从功能上来说,promise对象用来封装一个异步操作并可以获取其成功/失败的结果值;

异步编程包括:fs文件操作,数据库操作,AJAX,定时器

// fs操作
require('fs').readFile('./index.html', (err, data) => {})
// Ajax
$.get('/server', (data) => {})
// 定时器
setTimeout(()=>{}, 2000)

2、为什么使用Promise

2.1 指定回调函数的方式更加灵活

  1. 原来的方式:必须在启动异步任务之前指定;
  2. promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数

2.2 支持链式调用,可以解决回调地狱问题

  1. 什么是回调地狱
    回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件;
  2. 回调地狱的缺点
    不便于阅读和处理
  3. 解决方案
    promise链式调用

3、初次使用

// promise形式实现
// resolve 解决,函数类型数据
// reject 拒绝,函数类型数据
const p = new Promise((resolve, reject) => {
  setTimeout(()=> {
    let n = rand(1, 100);
    // 判断
    if(n<=30){
      resolve();    // 将promise对象的状态设置为成功
    }else{
      reject(); // 将promise对象的状态设置为失败
    }
  }, 1000);
});
// 调用then方法对promise中的resolve和reject进行定义
p.then(()=>{
  console.log("选中,恭喜");
}, ()=>{
  console.log("未选中,谢谢惠顾");
});

4、实践练习

4.1 fs模块

要求读取文件夹src下面的文件content.txt

// 1、采用回调函数的形式
const fs = require('fs');
fs.readFile('./src/content.txt', (err, data) => {
  // 如果出错,则抛出错误
  if(err) throw err;
  // 输出文件内容
  console.log(data.toString());
})

// 2、采用Promise的形式
let p = new Promise((resolve, reject) => {
   fs.readFile('./src/content.txt', (err, data) => {
     // 如果出错
     if(err) reject(err);
      // 如果成功
      resolve(data);
  });
});
//调用then
p.then(value => {
  console.log(value.toString());
}, reason => {
  console.log(reason);
})

4.2 ajax模块

点击按钮发送ajax请求

/*1、原来的方式*/
const btn = document.querySelector("#btn");
btn.addEventListener('click', function(){
  // 1.创建对象
  const xhr = new XMLHttpRequest();
  // 2.初始化
  xhr.open('GET', 'https://api.apiopen.top/getJoke');
  // 3.发送
  xhr.send();
  // 4. 处理响应结果
  xhr.onreadystatechange = function() {
    if(xhr.readyState === 4) {
      // 判断响应状态码 2xx
      if(xhr.status >= 200 && xhr.status < 300) {
        // 输出响应体
        console.log(xhr.response);
      } else {  
        // 输出响应状态码
        console.log(xhr.status);
      }
    }
  }
})

/*使用promise*/
const btn = document.querySelector('#btn');
btn.addEventListener('click', function(){
  const p = new Promise((resolve, reject) => {
    // 1、创建对象 
    const xhr = new XMLHttpRequest();
    // 2、初始化
    xhr.open('GET', 'https://api.apiopen.top/getJok');
    // 3、发送
    xhr.send();
    // 4、处理响应结果
    xhr.onreadystatechange = function(){
      // 判断状态
      if(xhr.readyState === 4){
          if(xhr.status >= 200 && xhr.status < 300){
            resolve(xhr.response);
          }else{
            reject(xhr.status);
          }
        }
    }
  })
});

p.then(value=>{
  console.log(value);
}, reason=>{
  console.warn();
})

5. promise的状态

状态指的是实例对象中的一个属性 【PromiseState】:

  • pending -> resolved 成功
  • pending -> rejected 失败

只有这两种,且一个promise对象只能改变一次,无论是成功还是失败,都有一个结果数据;
成功的结果一般称为value,失败的结果一般是reason;

6. promise 对象的值

实例对象中的另一个属性【PromiseResult】
保存异步任务【成功/失败】的结果

  • resolve
  • reject

7. promise的基本流程

基本流程

8. promise的相关API使用

8.1 promise构造函数

Promise(excutor){}

  • executor函数:执行器 (resolve, reject) => {}
  • resolve 函数:内部定义成功时候我们调用的函数 value => {}
  • reject 函数:内部定义失败时候我们调用的函数 reason => {}

8.2 Promise.prototype.then 方法

(onResolved, onRejected) => {}

  • onResolved函数:成功的回调函数 (value) => {}
  • onRejected函数:失败的回调函数 (reason) => {}
    指定用于得到成功value的成功回调和用于得到失败reason的失败回调,返回一个新的Promise对象

8.3 Promise.prototype.catch 方法

(onRejected) => {}

  • onRejected 函数:失败的回调函数 (reason) => {}

8.4 Promise.resolve方法

(value) => {}

  • value:成功的数据或者promise对象
let p1 = Promise.resolve(521);
console.log(p1);

8.5 Promise.reject方法

(reason)=>{}

  • reason: 失败的原因

8.6 Promise.all方法

(promises) => {}

  • 返回一个新的promise,只有所有的promise都成功才能成功,只要有一个失败就直接失败;

8.7 Promise.race方法

(promises) => {}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容