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

看板Ajax作者 (LaPass)時間7年前 (2017/01/23 14:59), 編輯推噓11(11017)
留言28則, 9人參與, 最新討論串1/1
範例 http://pastebin.com/hz39fQWC 期望的狀況是,寫入檔案的內容是 0,1,2,3,4.....,999, 但實際上,檔案的內容可能會變成這樣: ....8,9,11,10,12.... 也就是說,呼叫 fs.appendFile() 的順序 並不代表底層實際上處理的順序。 可能會有人回答: 用 fs.appendFileSync 或是 把字串黏好之後再寫到檔案 但我想問的不是這個 我貼出來的只是一個簡單的範例 這種底層處理順序問題 可能出現在,資料庫、socket等等,任何由底層去處理的異步動作上 只要底層實作時,不管順序問題 就可能遇到這種狀況 請問有什麼方式可以保證底層異步行為的處理順序問題? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.87.115 ※ 文章網址: https://www.ptt.cc/bbs/Ajax/M.1485154760.A.79E.html

01/23 15:11, , 1F
Promise
01/23 15:11, 1F

01/23 15:56, , 2F
也就是說只能自己處理好順序問題,然後用Promise去叫處理
01/23 15:56, 2F

01/23 15:56, , 3F
動作這樣嗎?
01/23 15:56, 3F

01/23 16:41, , 4F
01/23 16:41, 4F

01/23 16:41, , 5F
當然如果能用 async 或 bluebird 之類的套件就能更簡潔了
01/23 16:41, 5F

01/23 16:49, , 6F
了解,感謝。
01/23 16:49, 6F

01/23 17:40, , 7F
要確保順序就是要一個完成後 callback 回來再跑下一個
01/23 17:40, 7F

01/23 17:44, , 8F
jmlntw 的範例還是不保證順序吧 Promise 一建立就開
01/23 17:44, 8F

01/23 17:45, , 9F
始執行了 一開始就全部建好的話是不保證執行順序的
01/23 17:45, 9F

01/23 18:00, , 10F
j大的code沒問題吧 6~13行的函數宣告不會執行內容
01/23 18:00, 10F

01/23 18:00, , 11F
把你要執行的動作包成 function 推進 array 裡面
01/23 18:00, 11F

01/23 18:00, , 12F
然後 function 執行後回傳一個 Promise
01/23 18:00, 12F

01/23 18:00, , 13F
15~18 把這個函數塞進array 1000次 一樣沒執行
01/23 18:00, 13F

01/23 18:01, , 14F
對 array 裡面的 function 依序執行並等 Promise 結束
01/23 18:01, 14F


01/23 20:16, , 16F
對耶 我沒看清楚 不好意思 眼殘以為在 17 行執行了
01/23 20:16, 16F

01/24 13:19, , 17F
只要是async的東西就是不能確保順序 寫js這是死觀念
01/24 13:19, 17F

01/24 13:19, , 18F
要確保順序就是另外加手序去確保
01/24 13:19, 18F

01/26 02:20, , 19F
之前寫gulp task時是用recursive跑完一個task再跑下一個
01/26 02:20, 19F

01/26 02:20, , 20F
01/26 02:20, 20F

01/26 02:21, , 21F
而且我本來以為會比async慢但算了時間居然比較快耶
01/26 02:21, 21F

01/26 21:23, , 22F
這種時候,你應該直接 fs.createWriteStream()
01/26 21:23, 22F

01/26 21:24, , 23F
然後剩下的讓node幫你做
01/26 21:24, 23F

01/26 21:32, , 24F
手動處裡應該是只有node本身沒有這種機制時才用
01/26 21:32, 24F

02/15 10:33, , 25F
我知道你的意思。我這只是舉例用fs來表示而已,這可以用在
02/15 10:33, 25F

02/15 10:34, , 26F
所有底層異步的問題上
02/15 10:34, 26F

02/17 20:33, , 27F
然後所謂async,本來就只保證工作結束會通知吧?
02/17 20:33, 27F

02/17 20:34, , 28F
無論是失敗或成功,順序之類打從一開始就不再考慮範圍
02/17 20:34, 28F
文章代碼(AID): #1OXQd8UU (Ajax)
文章代碼(AID): #1OXQd8UU (Ajax)