当前位置: 首页 > news >正文

【ES6】Promise

Promise

回调地狱

const fs = require('fs');fs.readFile('./a.txt', 'utf-8', (err, data) => {if(err) throw err;console.log(data);fs.readFile('./b.txt', 'utf-8', (err, data) => {if(err) throw err;console.log(data);fs.readFile('./c.txt', 'utf-8', (err, data) => {if(err) throw err;console.log(data);})})
})

Promise

Promise对象可以解决回调地狱的问题

Promise可以理解为一个容器,里面可以编写异步程序的代码

基本用法
const fs = require('fs');//1、创建对象
let p = new Promise((resolve, reject) => {//把异步任务成功的结果传递给resolve函数,把失败的结果传递给reject函数fs.readFile('./a.txt', 'utf-8', (err, data) => {//读取文件的时候,没有错误err=null, 有错误err={} err ? reject(err) : resolve(data);})
});//2、获取成功失败结果
p.then(res => console.log(res), err => console.log(err));
Promise三种状态

pending fulfilled rejected

  • 最初状态pending, 等待中,此时promise的结果为undefined;

  • 当调用resolve(data)时, 状态变为 fulfilled

  • 当调用reject(err)时, 状态变为 error

  • 当达到最终的fulfilled或rejected时,promise的状态就不会再改变了(所以多次调用resolve,后面的resolve都无效,只取第一次)

    // 1、创建对象
    let p = new Promise((resolve, reject) => {
    resolve();
    resolve(123);//这次调用无效
    });

    // 2、获取成功失败结果
    p.then(res => console.log(res), err => console.log(err));

Promise同步异步?
console.log(1);//new Promise属于同步代码
new Promise((resolve, reject) => {console.log(2);resolve(3);console.log(4);
}).then(res => console.log(res), err => console.log(err));//.then这里是异步的console.log(5);// 1 2 4 5 3
then的链式调用
const fs = require('fs');let p1 = new Promise((resolve, reject) => {fs.readFile('./a.txt', 'utf-8', (err, data) => {err ? reject(err) : resolve(data);})
});let p2 = new Promise((resolve, reject) => {fs.readFile('./b.txt', 'utf-8', (err, data) => {err ? reject(err) : resolve(data);})
});let p3 = new Promise((resolve, reject) => {fs.readFile('./c.txt', 'utf-8', (err, data) => {err ? reject(err) : resolve(data);})
});//前一个then返回一个Promise对象
//后一个then可以得到前一个Promise对象的成功状态的值
p1.then(r1 => {console.log(r1); //aaareturn p2
}).then(r2 => {console.log(r2); //bbbreturn p3;
}).then(r3 => {console.log(r3); //ccc
})const fs = require('fs');function myReadFile(filename) {return p = new Promise((resolve, reject) => {fs.readFile(filename, 'utf-8', (err, data) => {err ? reject(err) : resolve(data);})})
}//前一个then返回一个Promise对象
//后一个then可以得到前一个Promise对象的成功状态的值
myReadFile('./a.txt').then(r1 => {console.log(r1); //aaareturn myReadFile('./b.txt');
}).then(r2 => {console.log(r2); //bbbreturn myReadFile('./c.txt');
}).then(r3 => {console.log(r3); //ccc
})
http://www.lryc.cn/news/299776.html

相关文章:

  • Leetcode 3035. Maximum Palindromes After Operations
  • SCM供应链系统:一文读懂,需要优化升级的看过来。
  • WSL外部SSH连接有效方法
  • MATLAB 1:基础知识
  • django安装使用
  • 基于LightGBM的回归任务案例
  • CTFshow web(php文件上传155-158)
  • Leetcode 53 最大子数组和
  • 【pandas 不同文件读取和存储】
  • python从入门到精通(十六):python爬虫的BeautifulSoup4
  • Codeforces Round 924(Div.2) A~E
  • django中实现观察者模式
  • Elasticsearch中的动态DSL解决方案
  • 【操作系统】MacOS虚拟内存统计指标
  • LeetCode:67.二进制求和
  • 修改GI文件的权限
  • OJ刷题:杨氏矩阵【建议收藏】
  • 2024-02-13 Unity 编辑器开发之编辑器拓展4 —— EditorGUIUtility
  • redis加锁实现方式
  • ClickHouse--08--SQL DDL 操作
  • 5种风格非常经典的免费wordpress主题
  • 「数据结构」哈希表2:实现哈希表
  • ITK 图像分割(一):阈值ThresholdImageFilter
  • 2023.2.6
  • 例39:使用List控件
  • 浏览器内核的主要功能模块介绍
  • 如何流畅进入Github
  • docker磁盘不足!已解决~
  • 法国实习面试——计算机相关专业词汇
  • LeetCode刷题计划