場景描述javascript
一、 地獄回調java
四、Generatorpromise
五、Asyncmarkdown
場景描述: 異步
咱們經常會遇到這樣的業務場景:後一步異步請求依賴前一步異步請求的結果,若是這樣的依賴層數比較多,那麼初學者很容易寫出地獄回調的代碼。async
如下代碼均以setTimeout模擬異步請求。異步編程
地獄回調函數
setTimeout(() => { console.log('step1'); setTimeout(() => { console.log('step2'); setTimeout(() => { console.log('step3'); }, 1000); }, 1000); }, 1000); 複製代碼
地獄回調優化
function step1() { setTimeout(() => { console.log('step1'); step2('step1'); }, 1000) } function step2(data) { setTimeout(() => { console.log('step2'); step3('step2'); }, 1000) } function step3(data) { setTimeout(() => { console.log('step3'); }, 1000) } step1(); 複製代碼
以上的代碼雖然看上去利於閱讀了,可是仍是沒有解決根本問題。而地獄回調的根本問題就是:
嵌套函數存在耦合性,一旦有所改動,就會牽一髮而動全身
嵌套函數一多,就很難處理錯誤
固然,回調函數還存在着別的幾個缺點,好比不能使用try catch捕獲錯誤,不能直接return。
如何解決回調地獄呢?
下面一塊兒來看看如何使用Promise:
promise
var step1 = function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step1'); }, 1000); }); } var step2 = function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step2') }, 1000); }); } var step3 = function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step3') }, 1000); }) } step1().then(function (data) { console.log(data); return step2(); }).then(data => { console.log(data); return step3(); }).then(data => { console.log(data); }) 複製代碼
Generator
var step1 = function () { return new Promise((resolve, reject) => { setTimeout(function () { resolve("step1"); }, 1000); }) } var step2 = function () { return new Promise((resolve, reject) => { setTimeout(function () { resolve("step2"); }, 1000); }) } var step3 = function () { return new Promise((resolve, reject) => { setTimeout(function () { resolve("step3"); }, 1000); }) } function* g() { yield step1(); yield step2(); yield step3(); } var step = g(); step.next().value.then(data => { console.log(data); return step.next().value; }).then(data => { console.log(data); return step.next().value; }).then(data => { console.log(data); }); 複製代碼
async
var step1 = async function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step1'); }, 1000); }); } var step2 = function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step2') }, 1000); }); } var step3 = function () { return new Promise(function (resolve, reject) { let st = setTimeout(() => { resolve('step3') }, 1000); }) } async function test() { var data1 = await step1(); console.log(data1); var data2 = await step2(); console.log(data2); var data3 = await step3(); console.log(data3) } test(); 複製代碼
最後,期待你們一同交流,共同進步。