es6 promise 和 es7 await

注意!!!

使用es7 async await presets必须使用stage-3,否则不会执行

1、使用了promise,不使用promise,可以用一个callback,不过如果callback也是一个异步就会形成回调地狱

比如

var a = 0;

setTimeout({

             a = 1

             console.log(a);

             setTimeout({

                  a = 2

                  console.log(a);

                  setTimeout({

                       a = 3

                       console.log(3);

                  },1000)

             },1000)

        },1000)

这段代码可以使用回调函数处理一下,代码如下

var a = 0;

function callback2(){

                            console.log(a)

                            setTimeout({

                                 a = 3

                             },1000)

                       }

function callback1(){

                  console.log(a)

                  setTimeout({

                       a = 2

                       callback2();                       

                 },1000)

funcition timer(){

     setTimeout({

             a = 1

             callback1();

      },1000) 

}

timer();        

这就形成了回调地狱,这段代码的执行效果是1秒后输出1,在一秒后输出2,在一秒后输出3,这段代码与下面的这段代码的执行是不一样的

setTimeout({

             console.log(1);                              

        },1000)

setTimeout({

                  console.log(2);

       },1000)

setTimeout({

                       console.log(3);

      },1000)

这段代码是会在一秒后同时输出1,2,3,不理解的话请参照下方链接

如果你使用promise的话,就不会陷入回调地狱了

function time(){

      return new Promise(function(resolve,reject){

                setTimeout(function(){

                     a = 1;

                     resolve(a);

                },1000)

      })

}

function callback1(){

       return new Promise(function(resolve,reject){

                setTimeout(function(){

                     a = 2;

                     resolve(a);

                },1000)

      })

}

function callback3(){

       return new Promise(function(resolve,reject){

                setTimeout(function(){

                     a = 3;

                     resolve(a);

                },1000)

      })

}

timer().then(function(data){

     console.log(data)   //一秒后输出1

     return callback1()

}).then(function(data){

     console.log(data) //一秒后输出2

     return callback2()

}) .then(function(data){

     console.log(data) //一秒后输出3

})

这里使用async await又该怎么去写呢,代码如下:

var a = 0;

async function time(){

      let response = await new Promise(function(resolve,reject){

                setTimeout(function(){

                     a = 1;

                     resolve(a);

                },1000)

      });

      console.log(response);

      return response;

}

async function callback1(){

      let response = await time()

      return response;

}

all的用法

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。我们仍旧使用上面定义好的runAsync1、runAsync2、runAsync3这三个函数,看下面的例子:

Promise
.all([runAsync1(), runAsync2(), runAsync3()])
.then(function(results){
    console.log(results);
});
  • 1
  • 2
  • 3
  • 4
  • 5

用Promise.all来执行,all接收一个数组参数,里面的值最终都算返回Promise对象。这样,三个异步操作的并行执行的,等到它们都执行完后才会进到then里面。那么,三个异步操作返回的数据哪里去了呢?都在then里面呢,all会把所有异步操作的结果放进一个数组中传给then,就是上面的results。所以上面代码的输出结果就是: 
这里写图片描述

有了all,你就可以并行执行多个异步操作,并且在一个回调中处理所有的返回数据,是不是很酷?有一个场景是很适合用这个的,一些游戏类的素材比较多的应用,打开网页时,预先加载需要用到的各种资源如图片、flash以及各种静态文件。所有的都加载完后,我们再进行页面的初始化。

https://www.jianshu.com/p/e5225ba4a025

其实很简单,一定得去理解,异步重开线程嘛,跟ajax其实一样的

这里是使用了promise的代码

var b = 2

function runAsync(){
    return new Promise(function(resolve,reject){
    setTimeout(function(){
           b = 6
           resolve(b)
    }, 2000);
    })
}

runAsync().then(function(data){console.log(data));    //6

下面使用了es7 async await 的代码,其实核心还是promise,只是promise的再次封装

var b = 2;

async function runAsync(){
    const testResult = await new Promise(function(resolve,reject){
    setTimeout(function(){
           b = 6
           resolve(b)
    }, 2000);
    })

    console.log(testResult);
}

runAsync()    //6

其实真的非常相似,只是舍弃了promise.then更加麻烦的写法

async、await串行并行处理

串行:等待前面一个await执行后接着执行下一个await,以此类推

async function asyncAwaitFn(str) {
    return await new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(str)
        }, 1000);
    })
}

const serialFn = async () => { //串行执行

    console.time('serialFn')
    console.log(await asyncAwaitFn('string 1'));
    console.log(await asyncAwaitFn('string 2'));
    console.timeEnd('serialFn')
}

猜你喜欢

转载自blog.csdn.net/fortunegrant/article/details/83213232