Promise简介

我们都知道javascript最令人头痛的问题就是异步问题,所以理所当然的产生了许多解决异步问题的方案,例如在Node.js中(下文中介绍也是Node.js),async,es6 generator等都是很好的解决方案,而在这里我们介绍的是Promise模式。而我们做举例的插件是 bluebird

catch error

之所以接触promise也是因为try catch的问题,当时发现try catch竟然可以捕获 callback方法里面的error,当时感觉到很无语,之后被人推荐才接触了promise。
promise提供了捕获错误的机制,例如下面代码

1
new Promise(function (fulfilled, rejected){
  var name = yuansc.name;
}).catch(function (e) {
    console.log('error:',e);
  })

如下代码就可以直接捕获异常,而且免去了写try catch的麻烦,打印如下

1
error: [ReferenceError: yuansc is not defined]

callback方法的使用

很多时候我们需要用到callback的方法,那么promise怎么使用callback呢

1
function callbackTest(callback) {
  return  new Promise(function (fuifilled, rejected) {
    fs.readFile('./file1', function(err, result) {
      if(err) {
    	rejected(err);
      }
      fuifilled(result);
    })
  }).nodeify(callback);
}
callbackTest(function (err, result) {
  console.log(err, result.toString());
});

根据上面代码我们可以看到promise一开始接收两个参数 fulfilled,以及rejected,当你使用这两个方法的是时候 rejected代表着callback第一个选项,fulfilled则对应着第二个选项,如果对应err,result的话,那么rejected是err, fulfilled 对应着result.

return Promise

promise很大的特点是你使用的时候可以继续返回一个promise对象,可以继续沿用promise的属性

1
function returnPromise() {
  return  new Promise(function (fulfilled, rejected) {
    fs.readFile('./file1', function(err, result) {
      if(err) {
        rejected(err);
      }
      fulfilled(result);
    })
  })
}
returnPromise().then(function (result) {
  console.log("result", result.toString());
}).catch(function (e) {
  console.log("error", e);
});

这样就达到了promise沿用的效果

then的沿用

then是promise很著名的一个关键字,而then也确实十分好用

1
function dothen() {
  return new Promise(function (fulfilled, rejected) {
    fulfilled("hello");
  }).then(function (value) {
      return value +" world"
    }).then(function (value) {
      console.log(value);
    })
}

这句话打印之后会是

1
hello world

PS

介绍不是很全面,更多细节请点击下面API
源代码
API