Promise对象的含义和基本用法

1.Promise的含义
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理更强大。git

所谓Promise,简单说就是一个容器,里面保存着某个将来才会结束的事件 (一般是一个异步操做)的结果。从语法上说,Promise是一个对象,从它能够获取异步操做的消息。github

Promise对象有如下2个特色:
1.对象的状态不受外界影响。Promise对象表明一个异步操做,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其余手段没法改变。
2.一旦状态改变,就不会再变,任什么时候候均可以获得这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象田静回调函数,也会当即获得这个结果。这与事件(Event)彻底不一样,事件的特色是,若是你错过了它,再去监听,是得不到结果的。编程

有了Promise对象,就能够把异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供了统一的接口,使得控制异步操做更加容易。json

2.基本用法

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

var promise = new Promise(function(resolve,reject){
  // ... some code
  if(/* 异步操做成功 */){
    resolve(value);
  }else{
    reject(error);
  }
});

Promise构造函数接受一个函数做为参数,该函数的两个参数分别是resolvereject。它们是两个函数,又JavaScript引擎提供,不是本身部署。app

resolve函数的做用,将Promise对象的状态从“未完成”变成“成功”(即从Pending变为Resolved),在异步操做成功时调用,并将异步操做的结果,做为参数传递出去;
reject函数的做用是,在异步操做失败时调用,并将异步操做报出的错误,做为参数传递出去。异步

Promise实例生成之后,能够用then方法分别制定Resolved状态和Rejected状态的回调函数异步编程

promise.then(function(value){
  // sucess
},function(error){
  // failure
});

then方法能够接受2个回调函数做为参数,第二个函数是可选的,不必定要提供。这两个函数都接受Promise对象传出的值做为参数。函数

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

function timeout(ms){
  return new Promise((resolve,reject)=>{
    setTimeout(resolve,ms,'done');
  });
}

timeout(100).then((value)=>{
  console.log(value);
});

上面代码中,timeout方法返回一个Promise实例,表示一段事件之后才会发生的结果。过了指定的时间(ms参数)之后,Promise实例的状态变为Resolved,就会触发then方法绑定的回调函数。

Promise新建后就会当即执行

let promise = new Promise(function(resolve,rejeact){
  console.log('Promise');
  resolve();
});

promise.then(function(){
  console.log('Resolved');
});

console.log('Hi');

// Promise
// Hi
// Resolved

上面代码中,Promise新建后当即执行,因此首先输出的是”Promise”,而后then方法指定的回调函数,将在当前脚本全部同步任务执行完才会执行,因此”Resolved”最后输出。

下面是异步加载图片的例子:

function loadImageAsync(url){
  return new Promise(function(resolve,reject){
    var image = new Image();
    image.onload = function(){
      resolve(image);
    };
    image.onerror = function(){
      reject(new Error('Could not load image at' + url));
    };

    image.src = url;
  });
}

下面是一个用Promise对象实现Ajax操做的例子:

var getJSON = function(url){
  var promise = new Promise(function(resolve,reject){
    var client = new XMLHttpRequest();
    client.open('GET',url);
    client.onreadystatechange = handler;
    client.responseType = 'json';
    client.setRequestHeader('Accept','application/json');
    client.send();

    function handler(){
      if(this.readyState !== 4){
        return;
      }
      if(this.status === 200){
        resolve(this.response);
      }else{
        reject(new Error(this.statusText));
      }
    }
  });

  return promise;
};

//
getJSON('/posts.jons').then(function(json){
  consoloe.log(json);
},function(error){
  console.log('出错了');
});

 

本文转载至http://www.javashuo.com/article/p-yxxllroj-nk.html

相关文章
相关标签/搜索