JavaScript中的Promise小结

一、 什么是Promise

   Promise是抽象异步处理对象以及对其进行各类操做的组件。Promise并非从JavaScript中发祥的概念。Promise最初被提出是在 E语言中, 它是基于并列/并行处理设计的一种编程语言。如今JavaScript也拥有了这种特性,这就是本文所介绍的JavaScript Promise。另外,若是说到基于JavaScript的异步处理,我想大多数都会想到利用回调函数。 Promise是一个类,能够建立实例表明承诺,而何时会用到承诺 ,通常是异步任务,就是须要很长时间执行的时间html

Promise的状态

用new Promise 实例化的promise对象有如下三个状态。git

  • Fulfilled resolve(成功)时。此时会调用 onFulfilled
  • Rejected reject(失败)时。此时会调用 onRejected
  • Pending 既不是resolve也不是reject的状态。也就是promise对象刚被建立后的初始化状态等

promise对象的状态,从Pending转换为Fulfilled或Rejected以后, 这个promise对象的状态就不会再发生任何变化。也就是说,Promise与Event等不一样,在.then 后执行的函数能够确定地说只会被调用一次。另外,Fulfilled和Rejected这两个中的任一状态均可以表示为Settled(不变的)。github

Promise的建立

通常状况下咱们都会使用 new Promise() 来建立promise对象,可是除此以外咱们也可使用其余方法。 在这里,咱们将会学习如何使用 Promise.resolve 和 Promise.reject这两个方法。编程

let Promise = require('./Promise');
let p1 = new Promise(function(resolve,reject){
    setTimeout(function(){
     let num = Math.random();//生成一个随机数
      console.log(num);
      if(num>.5){
       resolve('大成功');
     }else{
       reject('小失败');
     }
    },2000);
});
p1.then(function(value){
    console.log('成功1=',value);
},function(reason){
    console.log('失败1=',reason);
});
p1.then(function(value){
    console.log('成功2=',value);
},function(reason){
    console.log('失败2=',reason);
});
复制代码

Promimst 函数

  • Promise.all Promise.all 接收一个 promise对象的数组做为参数,当这个数组里的全部promise对象所有变为resolve或reject状态的时候,它才会去调用 .then 方法。
function getURL(URL) {
    return new Promise(function (resolve, reject) {
        var req = new XMLHttpRequest();
        req.open('GET', URL, true);
        req.onload = function () {
            if (req.status === 200) {
                resolve(req.responseText);
            } else {
                reject(new Error(req.statusText));
            }
        };
        req.onerror = function () {
            reject(new Error(req.statusText));
        };
        req.send();
    });
}
var request = {
        comment: function getComment() {
            return getURL('http://azu.github.io/promises-book/json/comment.json').then(JSON.parse);
        },
        people: function getPeople() {
            return getURL('http://azu.github.io/promises-book/json/people.json').then(JSON.parse);
        }
    };
function main() {
    return Promise.all([request.comment(), request.people()]);
}
// 运行示例
main().then(function (value) {
    console.log(value);
}).catch(function(error){
    console.log(error);
});
复制代码
  • Promise.race 它的使用方法和Promise.all同样,接收一个promise对象数组为参数。 Promise.all 在接收到的全部的对象promise都变为 FulFilled 或者 Rejected 状态以后才会继续进行后面的处理, 与之相对的是 Promise.race 只要有一个promise对象进入 FulFilled 或者 Rejected 状态的话,就会继续进行后面的处理。
// `delay`毫秒后执行resolve
function timerPromisefy(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
// 任何一个promise变为resolve或reject 的话程序就中止运行
Promise.race([
    timerPromisefy(1),
    timerPromisefy(32),
    timerPromisefy(64),
    timerPromisefy(128)
]).then(function (value) {
    console.log(value);    // => 1
});
复制代码

Promise常见库

介绍一些第三方实现的和Promise兼容的类库json

  • 类库 Q 实现了 Promises 和 Deferreds 等规范。 它自2009年开始开发,还提供了面向Node.js的文件IO API Q-IO 等, 是一个在不少场景下都能用获得的类库,在angular.js里的promise就是用的q。
//let Q = require('q');
let Q = {
  defer(){
    let success,error;
    return {
      resolve(data){
        success(data);
      },
      reject(err){
        error(err);
      },
      promise:{
        then(onFulfilled,onRejected){
          success = onFulfilled;
          error = onRejected;
        }
      }
    }
  }
}
let fs = require('fs');
function readFile(filename){
   let defer = Q.defer();
   fs.readFile(filename,'utf8',function(err,data){
      if(err)
        defer.reject(err);
      else{
        defer.resolve(data);
      }
   });
   return defer.promise;
}
readFile('1.txt').then(function(data){
  console.log(data);
});
复制代码
  • petkaantonov/bluebird 这个类库除了兼容 Promise 规范以外,还扩展了取消promise对象的运行,取得promise的运行进度,以及错误处理的扩展检测等很是丰富的功能,此外它在实现上还在性能问题下了很大的功夫。
/**
 * bluebird是世界最快的promise库
 * //它能把任意的经过回调函数实现的异步API换成promiseapi
 */
let Promise = require('bluebird');
let fs = require('fs');
function promisifyAll(obj) {
  for (let key in obj) {
    if (obj.hasOwnProperty(key) && typeof obj[key] == 'function') {
      obj[key+'Async'] = Promise.promisify(obj[key]);
    }
  }
}
//它会遍历对象上面的全部方法,而后对每一个方法添加一个新的方法 Async
promisifyAll(fs);
fs.readFileAsync('./1.txt', 'utf8').then(data => console.log(data));
复制代码

Q 和 Bluebird 这两个类库除了都能在浏览器里运行以外,充实的API reference也是其特征。api

相关文章
相关标签/搜索