Re: [問題] 把非同步模擬成同步的問題

看板Web_Design作者 (adam!)時間7年前 (2018/06/21 13:17), 7年前編輯推噓3(303)
留言6則, 4人參與, 7年前最新討論串2/2 (看更多)
各位好,上一篇文章中 很多版友都建議我使用 await 的方法 不過我研究了一下之後發現,await好像和promise一樣 都是在處理 非同步與非同步間的流程控制 好像沒辦法達到 : 在同步與非同步交互流程中 把非同步的函式模擬成同步的 例如下面的例子 function resolveAfter2Seconds(x) { return new Promise(resolve => { setTimeout(() => { resolve(x); }, 2000); }); } async function getService() { return await resolveAfter2Seconds(10); } var value = getService(); console.log(value); console.log(222); //處理 getService() 後的後續流程 執行結果: Promise {<pending>} 222 (在不把 console.log(222) 包成 callback 的情況下) 請問是否有任何辦法讓這隻程式 變成 執行結果: 10 222 我總覺得這個問題好像很難 先祝各位大大有愉快的一天~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.7.85 ※ 文章網址: https://www.ptt.cc/bbs/Web_Design/M.1529558266.A.2B5.html ※ 編輯: awpadam (61.216.7.85), 06/21/2018 13:23:19

06/21 16:37, 7年前 , 1F
var value = await getService();
06/21 16:37, 1F
我看 await 只能寫在 有宣告成 async 的函數裡面 那我是不是我應該將外部整個包成一個 async function 呢? 如果是這樣的話,終究還是逃不了 要處理 //執行service的後續步驟 這邊的code ※ 編輯: awpadam (61.216.7.85), 06/21/2018 17:32:20

06/21 17:40, 7年前 , 2F
把全部東西包到一個async lambda裡直接跑?
06/21 17:40, 2F
剛剛也是想這樣,後續的程式碼超級多 我對async不熟,不知道這樣包會不會怎樣 而且我還要用babel轉成相容性的代碼,感覺不知道會出什麼事 我先來研究async到底在做什麼事 謝謝你們喔 ※ 編輯: awpadam (223.136.246.132), 06/21/2018 17:49:44

06/23 03:18, 7年前 , 3F
以前有寫過一篇關於 async 的文章 #1OnKhr9c (Ajax)
06/23 03:18, 3F
看起來你的結論也是:沒辦法 不過像上面寫的,把整塊用匿名函式包起來,前面加上async 然後裡面的非同步函式用 await 也的確可以運作 只是寫完之後要用babel轉成瀏覽器可支援的code ※ 編輯: awpadam (123.193.141.167), 06/23/2018 10:32:26

06/23 16:43, 7年前 , 4F
別忘了你用 async 的匿名函式包起來,得到的結果還是一個
06/23 16:43, 4F

06/23 16:43, 7年前 , 5F
匿名的非同步函式
06/23 16:43, 5F
這個我瞭解,請問這樣做會有什麼副作用嗎? ※ 編輯: awpadam (123.193.141.167), 06/23/2018 16:54:33

06/24 13:38, 7年前 , 6F
edge firefox chrome 都可以直接用 async 了吧
06/24 13:38, 6F
文章代碼(AID): #1RApJwAr (Web_Design)
文章代碼(AID): #1RApJwAr (Web_Design)