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)