-
-
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]); | |
} | |
})(); |
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 ครับ คือ โปรแกรมมันทำงานอย่างที่โปรแกรมเมอร์อยากให้มันทำนั่นแหละ แต่มันไม่ใช่วิธีที่ดี และสิ่งที่วินพยายามจะสื่อสารคือ อย่าเขียนโค้ดแบบนี้ งี้ปะนะ
ผมติดอยู่อีกนิดเดียวคือ อยากรู้ว่า ต.ย. ที่หนึ่ง ถ้าเขียนให้ดีกว่านี้ จะเขียนยังไงนะครับ
mislead2 นี่ผมคิดว่ามันเป็นไปตามที่คนโปรแกรมอยากทำนะครับ ก็คือให้รอ ก็ดูเข้าใจดี (เพราะ keyword คือ await ก็ต้องรอ ถูกไหมฮะ?)
ส่วน mislead นี่ มันขึ้นกับ cache.do นั้น ใน param ที่ 2 รับ promise ไหม? เพราะจริงๆถ้ามันรับอยู่แล้ว ด้านในเราโยนแค่ db.findOne() ก็พอครับ, แล้วถ้า cache.do returns promise อยู่แล้ว ก็ไม่ต้องใส่ keyword async/await อะไรเลย แต่ถ้ามันเป็น callback... อันนี้ใช้ promise ยังไม่ได้เลยอะ