最近在做項目的時候,需要用到兩個接口,B接口的請求數據需要用到A接口sucess成功之后返回的數據:就像這樣:A>{B}。但是老是報錯,得不到想要的東西。上網上查找了一下資料,得到的原因是因為Ajax是異步的,B請求的時候A的success之后的數據可能並沒有得到,所以呢,就導致程序運行不下去。
為了發揚程序遠的精神,開始百度谷歌,網上解決方法比較多的就是這個:async: false
我把程序改成同步,哎,等着你得到數據,我再走,這樣就解決啦。但是我感覺這個方法賊蠢,先不說導致頁面卡死的問題,沒法加載下面的js代碼。哎,就感覺很low,沒逼格,哈哈!
那么我轉念一想,都是異步改同步的思路,那么A>{settimeout(function(){B},0)},我把B利用定時器,放到任務隊列中,那么只有當主隊列,也就是A所在的隊列執行完后,B接着執行,問題也是可以解決的,這樣呢,最起碼頁面不會鎖死,以為自己很帥,問題解決。這就是我自己想出來的第二個方法。
為什么說問題解決而不是完美解決呢?因為有很多大神會噴我亂用settimeout,我想起來了前兩天寫的es6中的promise···好像也可以解決
於是>>
A{
var promise = new Promise(function(reslove,reject){
if(sucess){
reslove(data) //data是sucesss之后得到的數據
}else{
reject(err)
}
})
return promise
}
調用呢,就這樣:A.then(function(data){B(data)}).catch(function(){})
這個方法,es6新知識,如果在用es3的小伙伴可以上網上找類似插件
總結:這個東西是我由第一個方法聯想到的其他兩個方法,promise,同步異步,js單線程,這些細節網上都有。
