美文网首页
ES6 Promise

ES6 Promise

作者: 灬劣徒 | 来源:发表于2019-11-28 15:02 被阅读0次
image

promise的含义

promise是异步编程的一种解决方案,比传统的解决方案(回调函数/事件)更合理更强大。

所谓promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise提供统一的API,各种异步操作都可以用同样的方法进行处理。

Promise对象有以下两个特点。
①对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pedding(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。

②一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pedding变为fulfilled和从pedding变为rejected。只要这两种情况发生,状体就凝固了,不会再变了,会一直保持这个结果,这时就称为resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果,这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。

基本用法

ES6规定,Promise对象是一个构造函数,用来生成Promise实例。

const promise = new Promise(function(resolve,reject) {
  if(/* 异步操作成功*/){
    resolve(value);
  }else{
    reject(error);
  }
})

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

resolve函数的作用是,将Promise对象的状态从pedding变为resolved,在异步操作成功时调用,并将异步操作的结果作为参数传递出去;rejected函数的作用是,将Promise对象的状态从pedding变为rejected,在异步操作失败时调用,并将异步操纵报出的错误,作为参数传递出去。

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

promise.then(function(value) {
  //success
},function(error) {
  //fail
})

then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象状态变为rejected时调用。其中,第二个函数时可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

下面是一个Promise对象的简单例子。

function timeout(ms) {
  return new Promise((resolve,reject) => {
    setTimeout(resolve,ms,'done');
  })
}
timeout(100).then(value) => {
  console.log(value);
}

then方法返回的是一个Promise实例,表示一段时间以后才会产生的结果。过了指定的时间以后,Promise实例的状态变为resolved,就会触发then方法绑定的回调函数。

这是一个异步加载图片的例子
function loadImageAsync(url) {
  return new Promise((resolve,reject) => {
    const image = new Image();
    image.onload = function() {
      resolve(image);
    }
    image.onerror = function() {
      reject(new error('失败'));
   }
 })
}

上面代码中,使用Promise包装了一个异步加载图片的例子。如果加载成功,就调用resolve方法,如果加载失败,就调用reject方法。

这是一个用Promise对象实现的AJAX操作的例子
const getJSON = function(url) {
  const promise = new Promise(function(resolve,reject) => {
    const client = new XMLHttpRequest();
    client.open("GET",url); 
    client.onreadystatechange = handle;
    client.responseType =  "json";
    client.setRequestHeader("Accept","Application/json");
    client.send();
  })
return Promise;
}

getJSON("/posts.json").then(function(json) {
  console.log("Contents:" + json);
},function() {
  console.log("出错了",error);
});

上面代码中,getJSON是对 XMLHttpRequest 对象的封装,用于发出一个针对 JSON 数据的 HTTP 请求,并且返回一个Promise对象。需要注意的是,在getJSON内部,resolve函数和reject函数调用时,都带有参数。

如果调用resolve函数和reject函数时带有参数,那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例,表示抛出的错误;

相关文章

网友评论

      本文标题:ES6 Promise

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