Promise简介
我们都知道javascript最令人头痛的问题就是异步问题,所以理所当然的产生了许多解决异步问题的方案,例如在Node.js中(下文中介绍也是Node.js),async,es6 generator等都是很好的解决方案,而在这里我们介绍的是Promise模式。而我们做举例的插件是 bluebird
catch error
之所以接触promise也是因为try catch的问题,当时发现try catch竟然可以捕获 callback方法里面的error,当时感觉到很无语,之后被人推荐才接触了promise。
promise提供了捕获错误的机制,例如下面代码
new Promise(function (fulfilled, rejected){
var name = yuansc.name;
}).catch(function (e) {
console.log('error:',e);
})
如下代码就可以直接捕获异常,而且免去了写try catch的麻烦,打印如下
error: [ReferenceError: yuansc is not defined]
callback方法的使用
很多时候我们需要用到callback的方法,那么promise怎么使用callback呢
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的属性
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也确实十分好用
function dothen() {
return new Promise(function (fulfilled, rejected) {
fulfilled("hello");
}).then(function (value) {
return value +" world"
}).then(function (value) {
console.log(value);
})
}
这句话打印之后会是
hello world