回調地獄、promise

當異步操作依賴於上一個異步操作的時候,需要進行異步操作的嵌套,否則無法保證回調的順序執行。但是採用回調嵌套,會形成回調地獄。
爲了解決回調地獄的問題,在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就可以做到嵌套異步操作又避免回調地獄的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章