舉一個文件操做的例子,先建立3個txt文件, a.txt,b.txt.c.txt 內容分別爲 aaaa,bbbbb,cccc`api
var fs = require('fs') //文件操做是異步的 執行順序不必定是按順序執行 fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) }) fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) }) fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) })
有時咱們可能想要程序按照順序執行異步
var fs = require('fs') //在a回調函數種執行b,b的回調函數種執行c 這樣就造成了多層嵌套,稱爲回調地獄 fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ //return console.log('讀取失敗') //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯 throw err; } console.log(data) }) }) })
隨之EcrameScript種出現了Promise這個api來解決這種回調嵌套的問題函數
下面是一個Promise的一個簡單案例ui
//Promise是一個構造函數 var fs = require('fs') /** * Promise容器中存放異步任務,有三個狀態, * Pending(正在進行), * Resolved(成功) * Rejected(失敗) * 執行結束只會有兩種結果 * Pending-->Resolved * Pending-->Rejected */ //建立Promise容器 一旦建立就會執行裏面的代碼 var p1 = new Promise(function(resolve,reject) { fs.readFile('./data/a.txt','utf8',function(err,data){ if(err){ reject('失敗') }else{ resolve(data) } }) }) var p2 = new Promise(function(resolve,reject) { fs.readFile('./data/b.txt','utf8',function(err,data){ if(err){ reject('失敗') }else{ resolve(data) } }) }) var p3 = new Promise(function(resolve,reject) { fs.readFile('./data/c.txt','utf8',function(err,data){ if(err){ reject('失敗') }else{ resolve(data) } }) }) /* 當p1執行成功的時候 當前函數種return的結果就能夠在then的funtion中獲得, 也就是能夠在then中的回調函數中獲得 return 123獲得的就是123 沒有return獲得的就是undefined 真正使用的話,咱們是能夠return一個Promise對象 return 一個Promise對象時,後續的then中的第一個參數就是返回的Promise對象的resolve參數 */ p1.then(function(data){ console.log(data); return p2 },function(err){ console.log(err); }) .then(function(data){ console.log(data); return p3 }) .then(function(data){ console.log(data); })