話說剛換工作一個月有余,在上家公司干的實在是不開心,然后就出來抱著試試的心態出來面了幾家公司,大多數公司問的前端問題也就那么多,其中有個面試問題讓我記憶猶新,只因為沒有答上來,哈哈!
當時面試官問我怎么解決回調函數里面回調另一個函數,另一個函數的參數需要依賴這個回調函數。如:
$http.get(url).success(function (res) {
if (success != undefined) {
success(res);
}
}).error(function (res) {
if (error != undefined) {
error(res);
}
});
function success (data){
if(data.id != 0){
var url = "getdata/data?id="+data.id+"";
$http.get(url).success(function (res) {
showData(res);
}).error(function (res) {
if (error != undefined) {
error(res);
}
});
}
}
一個回調后面有很多依賴的回調,怎么解決這個問題?
我說封裝,return 等等啊,但顯然不是面試官想要的解決辦法。回來以后問了一下同事,同事說es6 的Promise 可以解決啊,只怪我學識尚淺!然后我就查了一下,然后就豁然開朗了。
Promise
我只把我了解的到的記錄下來,大家多多指點!
Promise 構造函數只接收一個函數,這個函數兩個參數:resolve,reject,分別表示異步操作執行成功后的回調函數和異步操作執行失敗后的回調函數。其實可以理解為成功和失敗。你也許會說這有什么用?我們用的時候有可不只是 new Promise(function(resolve,reject){}) 就完了,Promise對象上有then、catch這兩個方法,還有很多方法這里就不一一介紹了!
then接收一個參數,是函數,并且會拿到我們在new Promise()中調用resolve時傳的的參數。
functin fun1(){
var a = new Promise(resolve,reject){
resolve(data);
}
return a ;
}
fun1().then(function(data){
console.log(data);
})
你以為這就完了?看別人是怎么用的:
then方法返回的是一個新的Promise實例。因此可以采用鏈式寫法,即then方法后面再調用另一個then方法。
getJSON("/posts.json").then(function(json) {
return json.post;
}).then(function(post) {
// ...
});
上面的代碼使用then方法,依次指定了兩個回調函數。第一個回調函數完成以后,會將返回結果作為參數,傳入第二個回調函數。
采用鏈式的then,可以指定一組按照次序調用的回調函數。這時,前一個回調函數,有可能返回的還是一個Promise對象(即有異步操作),這時后一個回調函數,就會等待該Promise對象的狀態發生變化,才會被調用。
到這里就可以完美解決回調依賴回調的問題了!
部分代碼借鑒于:阮一峰es6入門 http://es6.ruanyifeng.com/#docs/promise