Skip to content

Instantly share code, notes, and snippets.

@wingyplus
Last active May 2, 2019 09:29
Show Gist options
  • Save wingyplus/e5c265c6d32b426bf4c868ba9e3ef08d to your computer and use it in GitHub Desktop.
Save wingyplus/e5c265c6d32b426bf4c868ba9e3ef08d to your computer and use it in GitHub Desktop.
async function cacheDo() {
return await cache.do(key, async () => {
return await db.findOne();
});
}
(async () => {
let missyou = await cacheDo();
})()
(async () => {
for let i = 0; i < datasets.length; i++ {
await dowith(datasets[i]);
}
})();
@ehudthelefthand
Copy link

โคตรชวนงงจริงๆ ด้วย
mislead.js ผมเข้าใจว่า cache.do ไม่ได้ return promise ดังนั้นครอบด้วย promise ก่อนรึเปล่านะครับ เพราะ await หน้า cache.do นี่ ซ้ำซ้อนมากๆ
mislead2.js อันนี้คือ มันจะรอทุก loop ใช่มั้ยนะ ผมอ่านแล้วเข้าใจอย่างงั้น

@mixth
Copy link

mixth commented May 2, 2019

mislead2 นี่ผมคิดว่ามันเป็นไปตามที่คนโปรแกรมอยากทำนะครับ ก็คือให้รอ ก็ดูเข้าใจดี (เพราะ keyword คือ await ก็ต้องรอ ถูกไหมฮะ?)

ส่วน mislead นี่ มันขึ้นกับ cache.do นั้น ใน param ที่ 2 รับ promise ไหม? เพราะจริงๆถ้ามันรับอยู่แล้ว ด้านในเราโยนแค่ db.findOne() ก็พอครับ, แล้วถ้า cache.do returns promise อยู่แล้ว ก็ไม่ต้องใส่ keyword async/await อะไรเลย แต่ถ้ามันเป็น callback... อันนี้ใช้ promise ยังไม่ได้เลยอะ

@llun
Copy link

llun commented May 2, 2019

mislead.js ถ้าต้องการ cache key ทุกอย่างจริงๆใช้ถ้า map แล้ว await ด้วย Promise.all เอาน่าจะเข้าใจง่ายกว่า แล้วด้านในก็ไม่ต้อง await findOne return ออกมาเลย Promise.all await ให้ทีเดียว

@wingyplus
Copy link
Author

@ehudthelefthand ถ้ามัน await ได้แสดงว่ามันเป็น async function แสดงว่ามันโดนครอบ Promise มาแล้ว

@wingyplus
Copy link
Author

wingyplus commented May 2, 2019

@mixth มันถูกในสิ่งที่ programmer อยากทำแต่ไม่ถูกใน js context เพราะธรรมชาติมันเป็น single thread เพราะฉะนั้นมันควรจะเป็นอะไรแนวๆ นี้

await Promise.all(datasets.map(dset => dowith(dset)))

ท่านี้ทำ service ตายมานักต่อนักแล้ว T__T

ส่วน mislead.js นี่ชวนงงมาก หลายคนเข้าใจว่ามี async ต้องมี await ซึ่งจริงๆ แล้วมันไม่ต้องทำแบบนั้นก็ได้ พอเจอแบบนี้ก็มีคำถามอีกว่า await แบบนี้มันจะเกิดอะไรขึ้นเมื่อเทียบกับ return แบบไม่ใช้ await อีก

@wingyplus
Copy link
Author

@llun ประมาณนั้นเลยครับ

@ehudthelefthand
Copy link

ผมเข้าใจว่า mislead คือ โค้ดที่อ่านแล้วชวนให้เข้าใจผิด อารมณ์แบบ "คุณนึกว่า มันทำงานแบบนี้ใช่มั้ย จริงๆ แล้วมันทำงานแบบนี้ต่างหาก" ในกรณีของทั้งสองตัวอย่างข้างต้นผมเรียกมันว่า bad code ครับ คือ โปรแกรมมันทำงานอย่างที่โปรแกรมเมอร์อยากให้มันทำนั่นแหละ แต่มันไม่ใช่วิธีที่ดี และสิ่งที่วินพยายามจะสื่อสารคือ อย่าเขียนโค้ดแบบนี้ งี้ปะนะ
ผมติดอยู่อีกนิดเดียวคือ อยากรู้ว่า ต.ย. ที่หนึ่ง ถ้าเขียนให้ดีกว่านี้ จะเขียนยังไงนะครับ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment