[問題] 如何確保底層的處理順序?

作者: LaPass (LaPass)   2017-01-23 14:59:16
範例
http://pastebin.com/hz39fQWC
期望的狀況是,寫入檔案的內容是
0,1,2,3,4.....,999,
但實際上,檔案的內容可能會變成這樣:
....8,9,11,10,12....
也就是說,呼叫 fs.appendFile() 的順序
並不代表底層實際上處理的順序。
可能會有人回答:
用 fs.appendFileSync 或是 把字串黏好之後再寫到檔案
但我想問的不是這個
我貼出來的只是一個簡單的範例
這種底層處理順序問題
可能出現在,資料庫、socket等等,任何由底層去處理的異步動作上
只要底層實作時,不管順序問題
就可能遇到這種狀況
請問有什麼方式可以保證底層異步行為的處理順序問題?
作者: jmlntw (吉米林)   2017-01-23 15:11:00
Promise
作者: LaPass (LaPass)   2017-01-23 15:56:00
也就是說只能自己處理好順序問題,然後用Promise去叫處理動作這樣嗎?
作者: jmlntw (吉米林)   2017-01-23 16:41:00
例如這樣:http://pastebin.com/ZyL6x4xJ當然如果能用 async 或 bluebird 之類的套件就能更簡潔了
作者: LaPass (LaPass)   2017-01-23 16:49:00
了解,感謝。
作者: visa9527 (高級伴讀士官長)   2017-01-23 17:40:00
要確保順序就是要一個完成後 callback 回來再跑下一個
作者: dododavid006 (朔雪)   2017-01-23 17:44:00
jmlntw 的範例還是不保證順序吧 Promise 一建立就開始執行了 一開始就全部建好的話是不保證執行順序的
作者: Kenqr (function(){})()   2017-01-23 18:00:00
j大的code沒問題吧 6~13行的函數宣告不會執行內容
作者: s25g5d4 (function(){})()   2017-01-23 18:00:00
把你要執行的動作包成 function 推進 array 裡面然後 function 執行後回傳一個 Promise
作者: s25g5d4 (function(){})()   2017-01-23 18:01:00
對 array 裡面的 function 依序執行並等 Promise 結束https://github.com/azproduction/promise-queue
作者: dododavid006 (朔雪)   2017-01-23 20:16:00
對耶 我沒看清楚 不好意思 眼殘以為在 17 行執行了
作者: mrbigmouth (大嘴先生)   2017-01-24 13:19:00
只要是async的東西就是不能確保順序 寫js這是死觀念要確保順序就是另外加手序去確保
作者: TETZ (你今天宅了嗎?)   2017-01-26 02:20:00
之前寫gulp task時是用recursive跑完一個task再跑下一個http://pastebin.com/SD2SNT2E 大概4這樣而且我本來以為會比async慢但算了時間居然比較快耶
作者: mmis1000 (秋月戀楓)   2017-01-26 21:23:00
這種時候,你應該直接 fs.createWriteStream()然後剩下的讓node幫你做手動處裡應該是只有node本身沒有這種機制時才用
作者: LaPass (LaPass)   2017-02-15 10:33:00
我知道你的意思。我這只是舉例用fs來表示而已,這可以用在所有底層異步的問題上
作者: mmis1000 (秋月戀楓)   2017-02-17 20:33:00
然後所謂async,本來就只保證工作結束會通知吧?無論是失敗或成功,順序之類打從一開始就不再考慮範圍

Links booklink

Contact Us: admin [ a t ] ucptt.com