异步编程---Promise

110 阅读2分钟

JavaScript语言的执行环境是“单线程”。

所谓单线程,就是指一次只能执行一个任务,只有等执行完该任务,才能执行下下一个任务。简而言之,就是要排队,人人平等,先来后到,世界充满和平。

但这里有个问题,如果前面的任务需要花费的时间比较长,那后面的任务就只能干等着(好浪费呀),于是就有了异步编程。

异步编程有4种方式,在这里只讲其中一种:Promise。

Promises对象是CommonJS工作组提出的一种规范,目的是为异步编程提供统一接口

简单说,它的思想是,将说有耗时比较久的任务作为异步任务的回调函数放到后面再执行,先执行完所有同步任务,再执行这部分异步任务的回调函数。

new Promise( function( resolve, reject) {
       //some code 
      if(//异步操作成功){
        resolve(value);
         }else{
         reject(error);
         }
});

Promise构造函数接收一个函数作为参数,该函数的两个参数分别是resolve和reject,他们是两个函数,由Javascript引擎提供,不用自己部署。

resolve函数的作用是,将promise对象的状态从“pending”变为‘’resolved‘’,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数

举个例子:前端请求一个接口,获取通信录数据,然后渲染列表。在请求接口的时候可能因为数据量大而耗费的时间长,而渲染列表又是必须等拿回数据之后才能执行的。因此,我们可以使用promise异步请求数据,将渲染方法作为回调函数,先执行外部的同步函数,等拿到数据之后再执行。

function syncFunction(){
    return new Promise(function(resolve,reject){
    console.log("这是第一个异步操作内部");
    let result = '这是请求回来的数据';
    resolve(result)
   })
}
syncFunction().then(function(result){
      console.log('这是第一个回调函数')
})
    console.log('这是外部')

执行结果:


由上面的例子可以看出,syncFunction是个异步方法,在执行了syncFunction()方法之后,并没有马上执行then()里面的方法,而是执行了之后的console语句。等所有同步方法都执行完毕之后,才会执行then()里的方法。