網易雲音樂資料互動—async&await實現版
網易雲音樂資料互動—async&await實現版(完結篇)
我們的網易雲音樂系列課,尾聲了,今天我們要將一個最重要的東西--關於ES7 async結合Fetch非同步程式設計問題。
ES7 async/await被稱作非同步程式設計的終極解決方案,我們先不管這個稱呼,我們們先總結一下,過去5次分享我們一路走來非同步程式設計是如何產生,到最後如何解決的。
第一次分享我們學會了切圖和動態計算響應式rem佈局,第二次分享我們體會了如何學習使用原生js進行學習輪播圖,第三次分享了H5 audio這塊,進而引出了第四次的非同步請求歌詞ajax和第五次的Fetch+promise解決方案。
網易雲音樂資料互動—async&await實現版(完結篇)
但是每一種方案都不完美,我們透過程式碼來說明。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
var a = 12;
//模擬資料互動需要等1秒鐘
function loadData() {
setTimeout(function () {
a = 666;
}, 1000)
}
loadData();
console.log(a);
</script>
</head>
<body>
</body>
</html>
不用想,這個結果就是 12 而不是666,因為程式不會等1s才往下執行,但是有時候又必須使用資料,所以只能巢狀。但是巢狀多了又會出現下面的問題,案例來自SF的朋友,特此感謝。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
setTimeout(function () {
console.log("第一個非同步回撥了!")
setTimeout(function () {
console.log("第二個非同步回撥了!")
setTimeout(function () {
console.log("第三個非同步回撥了!")
setTimeout(function () {
console.log("第四個非同步回撥了!")
setTimeout(function () {
console.log("第五個非同步回撥了!")
}, 1000);
}, 1000);
}, 1000);
}, 1000);
}, 1000);
</script>
</head>
<body>
</body>
</html>
我特意寫了一個程式,這下大家就能體會他的缺陷。
那我們怎麼解決呢?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, "finish");
});
}
timeout(2000)
.then(value => {
console.log("第一層" + value);
return timeout(2000);
})
.then(value => {
console.log("第二層" + value);
return timeout(2000);
})
.then(value => {
console.log("第三層" + value);
return timeout(2000);
})
.then(value => {
console.log("第四層" + value);
return timeout(2000);
})
.then(value => {
console.log("第五層" + value);
return timeout(2000);
})
.catch(err => {
console.log(err);
});
</script>
</head>
<body>
</body>
</html>
Promise改成了鏈式,但是不夠完美,重點來了,今天的知識如何使用ES7 的async和await 讓我們跟我們寫日常普通程式碼一樣寫非同步程式碼呢?
大家發現了吧,這樣寫是不是正確並且簡單了啊,僅僅是加了兩個單詞而已,完整程式碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script>
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, "finish");
});
}
async function asyncTimeSys() {
await timeout(1000);
console.log("第一層非同步結束!")
await timeout(1000);
console.log("第二層非同步結束!")
await timeout(1000);
console.log("第三層非同步結束!")
await timeout(1000);
console.log("第四層非同步結束!")
await timeout(1000);
console.log("第五層非同步結束!")
return "all finish";
}
asyncTimeSys().then((value) => {
console.log(value);
});
</script>
</head>
<body>
</body>
</html>
好,我們不整沒用的我們看看實際專案裡面怎麼搞的,還是拿網易雲舉例:
網易雲音樂資料互動—async&await實現版(完結篇)
ok,感覺天都亮了。
簡單吧,透過這個系列課程的學習大家已經完整的瞭解了一個專案的大體開發過程,同時也瞭解了一些容易出錯的方方面面,重點是涵蓋了ES6和ES7的新知識。
當然,完全靠我講大家體會不深,還是希望大家能夠真的自己認真練習,把這個專案做出來,而不是變成聽聽而已。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2818967/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [MAUI]模仿網易雲音樂黑膠唱片的互動實現UI
- Vue 實現網易雲音樂 WebAppVueWebAPP
- Vue之網易雲音樂PC版輪播圖的實現Vue
- 網易雲音樂資料全鏈路基線治理實踐
- Electron+Vue實現仿網易雲音樂實戰Vue
- Vue 全家桶實現網易雲音樂 WebAppVueWebAPP
- 實現一個網易雲音樂的 BottomSheetDialog
- AI音樂,騰訊音樂、網易雲音樂的新版圖?AI
- 網易雲音樂機器學習平臺實踐機器學習
- RocketMQ 在網易雲音樂的實踐MQ
- iOS仿網易雲音樂iOS
- Vue之網易雲音樂橫向選單的實現Vue
- 網易雲音樂推薦系統簡單實現系列
- Python爬蟲實踐-網易雲音樂Python爬蟲
- 網易雲音樂上市IPO招股書及簡要資料
- Python資料視覺化:網易雲音樂歌單Python視覺化
- 仿網易雲音樂webAppWebAPP
- 微信小程式-網易雲音樂微信小程式
- 仿網易雲音樂播放介面
- 一起來實現網易雲音樂引導頁效果
- 使用jQuery仿製網易雲音樂移動端jQuery
- Android專案實戰之高仿網易雲音樂啟動介面Android
- LRC歌詞原理和實現高仿Android網易雲音樂Android
- 音樂市場格局再生變數,華研國際版權轉歸網易雲音樂變數
- Taro小程式仿網易雲音樂
- Flutter仿網易雲音樂:播放介面Flutter
- Curve 替換 Ceph 在網易雲音樂的實踐
- Python爬蟲實踐--爬取網易雲音樂Python爬蟲
- 開源的網易雲音樂API專案都是怎麼實現的?API
- 網易雲音樂財報:2022年網易雲音樂營收90億元 同比增長28.5%營收
- 基於 React + TypeScript 的網易雲音樂ReactTypeScript
- 網易雲音樂解鎖灰色歌曲教程
- 網易雲音樂的一個評論
- 網易雲音樂基於Flink實時數倉實踐
- 網易音樂版輪播-react元件版本React元件
- 網易雲音樂介面+vue全家桶開發一款移動端音樂webAppVueWebAPP
- 網易雲音樂質量視覺化實踐 - 張文視覺化
- 網易雲音樂網路庫跨平臺化實踐