ECMA Script 6_异步编程之 Promise

Posted tianxiaxuange

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ECMA Script 6_异步编程之 Promise相关的知识,希望对你有一定的参考价值。

Promise 对象

异步编程 方案,已同步的方式表达异步的代码,解决回调地狱的问题

比传统的解决方案——回调函数事件——更合理和更强大

是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理

  • 基本使用
  • const promise = new Promise(function(resolve, reject) {
        // ... some code
    
        if (/* 异步操作成功 */){
            resolve(value);
        } else {
            reject(error);
        }
    });
    
    promise
        .then(
            ()=>{
                console.log(‘成功的回调‘);
            },
            ()=>{
                console.log(‘失败的回调‘);
            },
        );
    console.log(‘主线程执行完了‘);
    
    
    
    
    /****    等同于    ****/
    const promise = new Promise((resolve, reject)=>{
        /*
        resolve 解决 成功    将 Promise 对象的状态 由初始化变成成功
        reject 拒绝 失败    将 Promise 对象的状态 由初始化变成失败
    
        Promise 三种状态
            初始化状态
            成功状态
            失败状态
        */
        setTimeout(function(){
    const result = 202; console.log(
    ‘请求成功了‘); resolve(result); // 触发成功的回调 }, 1000); }); promise.then(result=>{ console.log(‘成功的回调‘+result); }).catch((result)=>{ console.log(‘失败的回调‘+result); }); console.log(‘主线程执行完了‘);
  • Promise.resolve() 和 Promise.reject()    创建对象,状态为 成功 和 失败
  • 技术分享图片
  • Promise.all([要检测的对象数组]);    // 在所有的 promise 都触发 resolve 回调,才会成功。
  • 成功时接收 resolve ,失败只接收 reject。结果为数组
  • 技术分享图片
  • 实例
  • /**** 简单 独立异步任务 ****/
        const a = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 1000);
        });
        
        const aa = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 2000);
        });
        
        const aaa = new Promise((resolve, reject)=>{
            setTimeout(function(){
                resolve("成功!");
            }, 3000);
        });
        
        Promise.all([a, aa, aaa]).then(result=>{
            console.log(result);    // 接收到数组是 每个 Promise 发送过来的结果
        }).catch(result=>{
            console.log(result);
        });
        
        console.log(‘主线程执行完了!‘);
        
    /**** 复杂 分线程关联任务 ****/
        const b = new Promise((resolve, reject)=>{
            setTimeout(function(){
                console.log("Done1"+"First");
                resolve("Done1"+"First");
            }, 1000);
        });
        
        b.then(result=>{
            return  new Promise((resolve, reject)=>{
                        setTimeout(function(){
                            console.log("Done2"+result);
                            resolve("Done2"+result);
                        }, 2000);
                    });
        }).catch()
         .then(result=>{
            return  new Promise((resolve, reject)=>{
                        setTimeout(function(){
                            console.log("Done3"+result);
                            resolve("Done3"+result);
                        }, 3000);
                    });
        }).catch()
         .then(result=>{
            console.log("All Done!"+result);
        }).catch()
        
        console.log(‘主线程执行完了!‘);

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

3

33

3

3

3

3

3

3

3

3

3

33

33

3

3

3

3

3

3

3

3

3

3

技术分享图片

以上是关于ECMA Script 6_异步编程之 Promise的主要内容,如果未能解决你的问题,请参考以下文章

ECMA Script 6新特性之解构赋值

ECMA Script 6_symbol(symbol.iterator) 新接口_iterator接口

ECMA Script 6_数值的扩展

ECMA Script 6_函数的扩展

ES6ECMA Script 6_简单介绍

04 ECMA Script