JS 同步轉異步之Promise

同步方法在promise示例中變成異步執行:

[url=][/url]
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);[url=][/url]
 

輸出:
由此,利用Promise實現同步轉異步函數:

[url=][/url]
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) // 異步調用syncTask15   .then(function (num) { // 獲取syncTask函數返回值16   console.log(num);17 });18 19 console.log("我是用來陪襯的,雖然在後邊,但是異步在我後邊執行");[url=][/url]
 

輸出:
利用以上原理,封裝一個同步轉異步的函數:

[url=][/url]
1 // 把同步的任務轉成異步任務 2 function createAsyncTask(syncTask) { 3   return Promise.resolve(syncTask).then(syncTask => syncTask()); 4 } 5 6 function syncTask() { // 同步任務函數 7   console.log('這是異步任務,沒有按順序執行'); 8   return 4; 9 }10 11 createAsyncTask(syncTask) // 將同步任務轉爲異步任務12 .then(res => console.log(res));// 接收同步任務函數syncTask的返回值res13 14 console.log("我是用來陪襯的,雖然在後邊,但是異步在我後邊執行");[url=]

 

[/url]
 

輸出:
 

 

備註:Promise.resolve的用法。

[url=]

 

[/url]
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);[url=]

 

[/url]
 

輸出:
 

p1與p2相同,也就是說,兩種生成Promise的方式是等價的。
結果都是生成一個已經決議爲成功的Promise實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章