es6 Promise 详解:

Promise 对象:

什么是Promise对象:

  • Promise 是异步编程的一种解决方案,比起传统的解决方案(回调函数和事件),它显得更加强大,从语法讲:Promise是一个对象,从他可以获取异步操作的消息,Promse对象提供统一的 API,各种异步操作都可用同样的方法进行处理;
  • Promise 对象有两个特点:
    • 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来。
    • 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。
  • promise 有三个状态:
  • 1、pending:刚刚创建一个 Promise 实例的时候,表示初始状态;
  • 2、fulfilledresolve 方法调用的时候,表示操作成功;
  • 3、rejectedreject 方法调用的时候,表示操作失败;

Promise的使用场景:

解决了异步编程的中的回调地狱【回调地狱就是,回调函数嵌套回调函数,回调函数之间可以任意插入代码,并且可以随意交换位置】

//导入文件模块
const fs = require("fs");
// function getData(path, datafn, errfn) {
//     // new Promise()是立即执行构造函数的代码的,构造函数是隐含return的
//     return new Promise(function() {
//         fs.readFile(path, "utf8", function(err, data) {
//             if (err) {
//                 // return console.log(err)
//                 errfn(err.message);
//             }
//             // console.log(data)
//             datafn(data);
//         });
//     });
// }
// getData("./files/1.txt", function (data) {
//     console.log(data)
// }, function (err) {
//     console.log(err.message)
// });
 
// 相当于下面,只不过是将作为参数的函数用.then方法传到promise实例的函数的形参
function getData(path) {
    // new Promise()是立即执行构造函数的代码的,构造函数是隐含return的
    return new Promise(function(resolve, reject) {
        fs.readFile(path, "utf8", function(err, data) {
            if (err) {
                // return console.log(err)
                reject(err.message);
            }
            // console.log(data)
            resolve(data);
        });
    });
}
getData("./files/1.txt").then(function(data) {
    console.log(data)
        // 此时必须再返回一个promise构造函数的实例,也就是翻出去你需要请求的数据调用,这样才能继续用.then
        // .then 是promise对象的一个属性
    return getData("./files/2.txt");
    // 如果报错,可以继续执行后面的代码
}, function(err) {
    console.log(err.message)
    return getData("./files/2.txt");
}).then(function(data) {
    console.log(data);
    return getData("./files/3.txt");
}).then(function(data) {
    console.log("文本3", data)
});

promise常用的方法:

  • Promise.prototype.then()

    • then方法返回一个新的Promise实例,并接收两个参数onResolved(fulfilled状态的回调);onRejected(rejected状态的回调,该参数可选)
  • Promise.prototype.catch()

    • catch方法返回一个新的Promise实例
  • Promise.all()

    • Promise.all()方法将多个多个Promise实例,包装成一个新的Promise实例,该方法接受一个由Promise对象组成的数组作为参数(Promise.all()方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例),注意参数中只要有一个实例触发catch方法,都会触发Promise.all()方法返回的新的实例的catch方法,如果参数中的某个实例本身调用了catch方法,将不会触发Promise.all()方法返回的新实例的catch方法

promise 优点:

  • ①统一异步 API
    • Promise 的一个重要优点是它将逐渐被用作浏览器的异步 API ,统一现在各种各样的 API ,以及不兼容的模式和手法。
  • ②Promise 与事件对比
    • 和事件相比较, Promise 更适合处理一次性的结果。在结果计算出来之前或之后注册回调函数都是可以的,都可以拿到正确的值。 Promise 的这个优点很自然。但是,不能使用 Promise 处理多次触发的事件。链式处理是 Promise 的又一优点,但是事件却不能这样链式处理。
  • ③Promise 与回调对比
    • 解决了回调地狱的问题,将异步操作以同步操作的流程表达出来。
  • ④Promise 带来的额外好处是包含了更好的错误处理方式(包含了异常处理),并且写起来很轻松(因为可以重用一些同步的工具,比如 Array.prototype.map() )。

promise 缺点:

  • 1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。
  • 2、如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
  • 3、当处于Pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
  • 4、Promise 真正执行回调的时候,定义 Promise 那部分实际上已经走完了,所以 Promise 的报错堆栈上下文不太友好

你可能感兴趣的:(ECMA,script,6)