-
-
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]); | |
} | |
})(); |
mislead2 นี่ผมคิดว่ามันเป็นไปตามที่คนโปรแกรมอยากทำนะครับ ก็คือให้รอ ก็ดูเข้าใจดี (เพราะ keyword คือ await ก็ต้องรอ ถูกไหมฮะ?)
ส่วน mislead นี่ มันขึ้นกับ cache.do นั้น ใน param ที่ 2 รับ promise ไหม? เพราะจริงๆถ้ามันรับอยู่แล้ว ด้านในเราโยนแค่ db.findOne() ก็พอครับ, แล้วถ้า cache.do returns promise อยู่แล้ว ก็ไม่ต้องใส่ keyword async/await อะไรเลย แต่ถ้ามันเป็น callback... อันนี้ใช้ promise ยังไม่ได้เลยอะ
mislead.js
ถ้าต้องการ cache key ทุกอย่างจริงๆใช้ถ้า map แล้ว await ด้วย Promise.all
เอาน่าจะเข้าใจง่ายกว่า แล้วด้านในก็ไม่ต้อง await findOne return ออกมาเลย Promise.all await ให้ทีเดียว
@ehudthelefthand ถ้ามัน await ได้แสดงว่ามันเป็น async function แสดงว่ามันโดนครอบ Promise มาแล้ว
@mixth มันถูกในสิ่งที่ programmer อยากทำแต่ไม่ถูกใน js context เพราะธรรมชาติมันเป็น single thread เพราะฉะนั้นมันควรจะเป็นอะไรแนวๆ นี้
await Promise.all(datasets.map(dset => dowith(dset)))
ท่านี้ทำ service ตายมานักต่อนักแล้ว T__T
ส่วน mislead.js นี่ชวนงงมาก หลายคนเข้าใจว่ามี async ต้องมี await ซึ่งจริงๆ แล้วมันไม่ต้องทำแบบนั้นก็ได้ พอเจอแบบนี้ก็มีคำถามอีกว่า await แบบนี้มันจะเกิดอะไรขึ้นเมื่อเทียบกับ return แบบไม่ใช้ await อีก
@llun ประมาณนั้นเลยครับ
ผมเข้าใจว่า mislead คือ โค้ดที่อ่านแล้วชวนให้เข้าใจผิด อารมณ์แบบ "คุณนึกว่า มันทำงานแบบนี้ใช่มั้ย จริงๆ แล้วมันทำงานแบบนี้ต่างหาก" ในกรณีของทั้งสองตัวอย่างข้างต้นผมเรียกมันว่า bad code ครับ คือ โปรแกรมมันทำงานอย่างที่โปรแกรมเมอร์อยากให้มันทำนั่นแหละ แต่มันไม่ใช่วิธีที่ดี และสิ่งที่วินพยายามจะสื่อสารคือ อย่าเขียนโค้ดแบบนี้ งี้ปะนะ
ผมติดอยู่อีกนิดเดียวคือ อยากรู้ว่า ต.ย. ที่หนึ่ง ถ้าเขียนให้ดีกว่านี้ จะเขียนยังไงนะครับ
โคตรชวนงงจริงๆ ด้วย
mislead.js ผมเข้าใจว่า cache.do ไม่ได้ return promise ดังนั้นครอบด้วย promise ก่อนรึเปล่านะครับ เพราะ await หน้า cache.do นี่ ซ้ำซ้อนมากๆ
mislead2.js อันนี้คือ มันจะรอทุก loop ใช่มั้ยนะ ผมอ่านแล้วเข้าใจอย่างงั้น