promise 一个标准,Promise也已经纳入了ES6,而且高版本的chrome、firefox浏览器都已经原生实现了Promise,它描述了异步调用的返回结果,包括正确返回结果和错误处理,可以解耦异步调用中的复杂嵌套问题。关于详细的说明文档可以参考 Promises/A+ 。目前实现 promise 标准的模块有很多,如 Q 、 bluebird 和 Deferred ,下面我们以 Q 为例,介绍一下 promise 在 nodejs 中的使用方法。
有这么一个场景:有三个文件file1、file2、file3,按照先后顺序依次读取,然后拼接起来(或者说一个函数用到另外一个函数的值)。
传统通过回调嵌套方式实现同步,来保障拼接的字符串不会乱。
var str = 'begin';
fs.readFile('file1.txt', function(err, data1) {
str += data1;
fs.readFile('file2.txt', function(err, data2) {
str += data2;
fs.readFile('file3.txt', function(err, data3) {
str += data3;
});
});
});
我们现在采用基于promise规范的Q
安装:npm install q
引入项目:var Q = require('q');
首先将上面3层嵌套代码解耦和,并用Q.deferred构建
var Q = require('q'),
fs = require('fs');
var str = 'begin';
function read1(data) {
var deferred = Q.defer();
fs.readFile('file1.txt', function(err, data1) {
if (err) {
deferred.reject(err);
} else {
deferred.resolve(data += '~' + data1);
}