Promise是JS中进行异步编程的新解决方案。
从语法上来说:Promise是一个构造函数
从功能上来说:promise对象用来封装一个异步操作并可以获取其成功/失败的结果值
promise:启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束后指定/多个)
promise支持链式调用,可以解决回调地狱问题
回调地狱:回调函数嵌套使用,外部回调函数异步执行的结果是嵌套的回调执行的条件。不便于阅读,不便于异常处理。
Promise是什么?
1.1理解
1.抽象表达:
1)Promise是一门新的技术(ES6规范)
2)Promise是JS中进行异步编程的新解决方案
备注:旧方案是单纯使用回调函数
2.具体表达:
1)从语法上来说:Promise是一个构造函数
2)从功能上来说:Promise对象用来封装一个异步操作并可以获取其成功/失败的结果值
异步编程:
*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链式调用
案例 :
Promise初体验
Promise的第一个文档
Promise-fs读取文件下
//
const fs = require('fs');
//回调函数 形式
// fs.readFile('Promise初体验.html', (err, data) => {
// //如果出错,则抛出错误
// if (err) throw err;
// //输出文件内容
// console.log(data.toString());
// });
//Promise 形式
let p = new Promise((resolve, reject) => {
fs.readFile('Promise理解和使用.txt', (err, data) => {
//如果出错
if (err) reject(err);
//如果成功
resolve(data);
});
});
//调用 then
p.then(value => {
console.log(value.toString());
}, reason => {
console.log(reason);
})