同步方法在promise示例中變成異步執行:
console.log(1); let p = new Promise(resolve => { console.log(2); resolve(); console.log(3); }); console.log(4); p.then(() => { console.log(5); }); console.log(6);
輸出:

由此,利用Promise實作同步轉異步函式:
1 function syncTask() { // 同步任務函式 2 console.log('這是異步任務,沒有按順序執行'); 3 return 4; 4 } 5 6 function createAsyncTask() { // 利用Promise創建異步任務 7 var p = new Promise(function (resolve) { 8 resolve(); 9 }); 10 return p; 11 } 12 13 createAsyncTask() 14 .then(syncTask) // 異步呼叫syncTask 15 .then(function (num) { // 獲取syncTask函式回傳值 16 console.log(num); 17 }); 18 19 console.log("我是用來陪襯的,雖然在后邊,但是異步在我后邊執行");
輸出:

利用以上原理,封裝一個同步轉異步的函式:
1 // 把同步的任務轉成異步任務 Promise.resolve(value)方法回傳一個以給定值決議后的Promise 物件,在then中會執行傳入的這個函式(引數syncTask2自定義可以修改) 2 function createAsyncTask(syncTask) { 3 return Promise.resolve(syncTask).then(syncTask2 => syncTask2()); 4 } 5 6 function syncTask() { // 同步任務函式 7 console.log('這是異步任務,沒有按順序執行'); 8 return 4; 9 } 10 11 createAsyncTask(syncTask) // 將同步任務轉為異步任務 12 .then(res => console.log(res));// 接收同步任務函式syncTask的回傳值res 13 14 console.log("我是用來陪襯的,雖然在后邊,但是異步在我后邊執行");
輸出:

備注:Promise.resolve的用法,
1 // 傳遞一個普通的值
2 let p1 = new Promise(resolve => {
3 resolve('成功1!');
4 });
5
6 let p2 = Promise.resolve('成功2!');
7
8 function printContent(params) {
9 console.log(params);
10 }
11 p1.then(printContent);
12 p2.then(printContent);
輸出:

p1與p2相同,也就是說,兩種生成Promise的方式是等價的,
結果都是生成一個已經決議為成功的Promise實體,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/100536.html
標籤:JavaScript
上一篇:26.JavaScript實作物件混合與物件淺度克隆和物件的深度克隆
下一篇:ES6中的let
