當異步操作依賴於上一個異步操作的時候,需要進行異步操作的嵌套,否則無法保證回調的順序執行。但是採用回調嵌套,會形成回調地獄。
爲了解決回調地獄的問題,在ES6中新增了promise API
//新建一個承諾容器
var pi = new Promise(function(resolve,reject){
fs.readFile('./data/123.txt', 'utf8', function(err,data){
if(err){
//失敗了,承諾容器中的任務失敗了
//調用reject等於調用了then方法的第二個參數函數
reject(err)
//把容器的pending狀態變爲rejected
}else{
//承諾容器中的任務成功了
//這裏調用的resolve方法實際上就是then方法傳遞的那個function
resolve(data)
//把容器的pending狀態變爲resolve
}
})
})
//當p1成功了,然後(then)做指定的動作
//then方法接受的function就是容器中的resolve函數
p1.then(function(data){
//當前函數中return的結果就可以在後面then中的function接收到
//當return 一個 Promise 對象(這裏稱爲p2)的時候,
//後續的then中的方法的第一個參數做爲p2的resolve,第二個參數作爲p2的reject
return data;
},function(err){
console.log('讀取文件失敗了',err)
})
.then(function(data){
console.log(data)
})
首先,promise是一個容器,存放着當前任務完成後即將執行的代碼,promise容器一旦創建,就開始執行裏面的代碼。promise不是異步的,但是內部的任務一般都是異步的。
在promise內部就會根據異步操作是否成功來調用回調方法,回調方法依賴then傳入的兩個參數。這樣,通過在then方法的第一個參數(既當操作成功的時候會調用的方法)中return一個新的promise,然後鏈式調用then就可以做到嵌套異步操作又避免回調地獄的效果。