美文网首页
ES6快速学习(七)Promise

ES6快速学习(七)Promise

作者: slTrust | 来源:发表于2017-12-08 16:25 被阅读0次

回调函数

        function myAsync(callback){
            setTimeout(function(){
                console.log('执行完成');
                callback('data');
            }, 2000);
        }

        myAsync(function(data){
            console.log(data);
        });

Promise 解决了什么痛点

回调地狱 代码如下

myAsync(function(data){
    //第一个请求成功接收到数据  然后根据数据触发第二次请求
    console.log('第一个请求完成!')
    myAsync2(function(data){
        console.log('第二个请求完成!')
        myAsync3(function(data){
            console.log('第三个请求完成!')
             //一直一直的回调  排错是很困难的 代码也恶心
        })
    })
})

我的第一个Promise使用

let myPromise = new Promise(function(resolve, reject){
    //当异步代码执行成功时,我们才会调用resolve(...),
    // 当异步代码失败时就会调用reject(...)
    //使用setTimeout(...)来模拟异步代码  实际可以是Ajax请求
    console.log('异步请求中');
    setTimeout(function(){
        resolve("成功!"); //2秒后代码执行成功  调用resolve
    }, 2000);
});

myPromise.then(function(successMessage){
    //successMessage的值是上面调用resolve(...)方法传入的值.
    console.log("success! " + successMessage);
});

解决回调地狱之链式操作

Promise的优势在于:

  • 可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作。 是不是有种jquery的感觉!

链式操作的用法

  • Promise只是能够简化层层回调的写法,比传递callback的方式简单
function myAsync1(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步1完成');
            resolve('data1');
        }, 1000);
    });
    return p;            
}
function myAsync2(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步2完成');
            resolve('data2');
        }, 2000);
    });
    return p;            
}
function myAsync3(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步3完成');
            resolve('data3');
        }, 2000);
    });
    return p;            
}
//依次的异步操作
myAsync1()
    .then(function(data){
        console.log(data);
        return myAsync2();
    })
    .then(function(data){
        console.log(data);
        return myAsync3();
    })
    .then(function(data){
        console.log(data);
    });

reject( )是什么鬼?

就是异步操作通常有两种结果一个是成功一个是失败

function myAsync(){
    var p = new Promise(function(resolve, reject){
        //做一些异步操作
        setTimeout(function(){
            console.log('异步1完成');
            var num = Math.random()*100;
            if(num>60){
                 resolve('运气不错通过啦!'+num);
            }else{
                 reject('太差了,分不够!'+num)
            }
           
        }, 1000);
    });
    return p;            
}
myAsync()
    .then(
        function(data){
            console.log('resolved');
            console.log(data);//成功了  你手气不错!
        }, 
        function(reason, data){
            console.log('rejected');
            console.log(reason);//哎呦 挺倒霉啊!  再来一次吧!!
        }
    );

catch( ) 你肯定听过 try ...catch...

function myAsync(){
    var p = new Promise(function(resolve, reject){
                //做一些异步操作
                setTimeout(function(){
                    console.log('异步任务完成');
                    resolve('data');
                }, 1000);
            });
    return p;    
}
myAsync()
    .then(function(data){
        console.log('resolved');
        console.log(data);
        console.log(xxxx.xxxx); //此处的xxxx.xxxx未定义  报错
    })
    .catch(function(err){
        console.log('rejected');
        console.log(err);
    });

all( )

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。

Promise
.all([myAsync1(), myAsync2(), myAsync3()])
.then(function(results){
    console.log(results);
});
  • 用Promise.all来执行,all接收一个数组参数,里面的值最终都算返回Promise对象。
  • 这样,三个异步操作是并行执行的,等到它们都执行完后才会进到then里面。
  • 那么,三个异步操作返回的数据哪里去了呢?
  • 都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results。

race( )

all( ) 的效果实际上是 ==>以"执行时间最慢的"为准执行回调
race( ) 以最快的为准
race的用法与all一样,把上面myAsync3的延时改为0.5秒运行

Promise
.race([myAsync1(), myAsync2(), myAsync3()])
.then(function(results){
    //返回三个异步请求最快的那个
    console.log(results);
});

相关文章

  • ES6快速学习(七)Promise

    回调函数 Promise 解决了什么痛点 回调地狱 代码如下 我的第一个Promise使用 解决回调地狱之链式...

  • ES6异步:Promise

    #Promise迷你书通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise

  • promise

    本文是整理阮一峰大神ES6中 Promise 的学习笔记 目录: Promise.prototype.then()...

  • Promise

    es6中有个特别的对象Promise,今天我们就来学习它,了解它。 Promise含义 Promise 是异步编程...

  • 10. 回调和promise

    异步加载 JSES5 ES6 promise 学习视频记录

  • Promise浅析

    这是我自己最近学习promise的总结在ES6中Promise被列为正式规范,也是ES6中最重要的特性之一。 1....

  • ES6之Promise

    作者: kim先生 来源: 自创 今天我们讲的是ES6中的Promise这个异步操作对象。在学习Promise之前...

  • ES6--Promise

    学过ES6的同学大概都知道Promise,可想而知Promise在ES6中很重要。 Promise对象代表了未来将...

  • ES6 Promise

    在学习Promise之前,可以看一下张鑫旭大神这一篇 ES6 JavaScript Promise的感性认知 ...

  • es6 Promise 学习笔记2 链式调用

    es6 Promise 学习笔记1 基础代码解析 这期讲个复杂点的例子 then里的回调返回一个 Promise ...

网友评论

      本文标题:ES6快速学习(七)Promise

      本文链接:https://www.haomeiwen.com/subject/lgyeixtx.html