nodejs的全部调用几乎是全异步的,而全部的IO操做也都是经过回调函数才能知道结果。 若是一个异步调用依赖另外一个异步调用,若是没有Promise的话,代码会写的很诡异,看起来就像金字塔同样。html
fs.readFile('1.txt', function(err, data){ if(err){ console.log(err); return; } fs.readFile('2.txt', function(err, data){ if (err){ console.log(err); return; } console.log(data); fs.readFile('3.txt', ..... ..... }) })
还好bluebird的出现,缓解了这种状况node
npm install --save bluebird
var fs = require('fs'); var Promise = require('bluebird'); var readFileAsync = function(name){ return new Promise(function(resolve, reject){ fs.readFile(name, function(err, data){ if(err) { reject(err); } else { resolve(data); } }); }) }) readFileAsync('1.txt') .then(function(data1){ console.log(data1); return readFileAsync('2.txt'); }) .then(function(data2){ console.log(data2); }) .catch(function(err){ console.error(err) })
你可能觉的那个readFileAsync
那个函数怎么这么长。(我写成那样,实际上是为了让你理解bluebird最原始的用法)npm
简单的写法是这样的异步
var readFileAsync = Promise.promisify(fs.readFile)