[ 首頁 / 搜尋 / 管理Discord ] [ Komica首頁 ] [ 跨版面 ] [ 雜談 / / 攝影 / 運動 ] [ 人工智慧 / 程設交流 ] [ 蔚藍檔案 / 英雄聯盟 / 米哈遊 / Minecraft / 魔物獵人 / 勝利女神:妮姬 / Pokémon / 刀劍亂舞 ]

/cs/ - 程設交流

Computer science
Name
Email
Subject
Comment
File
Embed
Options
Password (For file deletion.)
  • Allowed file types:jpg, jpeg, png, gif, mp4, webm
  • Max filesize is 10 MB.
  • Max image dimensions are 10000 x 10000.
  • You may upload 1 per post.

  [Go to bottom]   [Catalog]   [Return]   [Archive]   [Featured]

File: 1706786435381.png (11.26 KB, 880x495, y8si4bfon2781j1crrwi.png)

7cbbd9aa No.138

有關promise問題想請教一下
一個連接redis 的library使用了promise,
我寫了一個func a() 讀取資料,
func b,c 進行運算
c()->b()->a()

想直接讀取結果所以func a 用了await,
由於用了await,必須使用async
結果整個project 都是async await或是then
請問有什麼方法可以改善?

0a7f20e1 No.139

不確定實際問題在哪裡
你不一定需要用await來呼叫async function
可以fire and forget的地方的話
直接呼叫也可以

不過這本來就是很複雜的問題就是了
https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/

6e1d67f1 No.140

沒有。
如果不想重寫 project 你可以:
1. 如果可以取得 thread,join thread
2. 把 async func 丟到另一個 thread
3. 用同步方法重寫 library

104f9e15 No.141

兩個菜逼八都沒講到重點
重點是你本來就應該用then
這叫做Promises chaining
https://javascript.info/promise-chaining
你正確使用promises寫起來的邏輯不會跟sync差到哪, 反而error handling還比較好做
至於講那join thread
你要不要聽聽自己到底在講三小
還thread
誰跟你講JS的async一定有threading

36224f69 No.142

>>141
wut?
問題不是"如何避免 async/await function call污染整個 calling chain?"嗎?
結果你回答 promise 寫得好就搞定

104f9e15 No.143

>>142
你用promise/then本來就不用async await
因為自己不會用promise chaining才導致錯誤的寫法, 根本本末倒置
你是140跟139兩個腦包的哪一個

36224f69 No.144

>>143
我是第三個腦包,所以請你幫幫我。
因為這個問題也困擾我很久。

function foo() {
result = bar();
return "FOO" + result;
}

function bar() {
return "BAR";
}

function main() {
result = foo();
console.log("main: foo returns " + result);
}

main()

上面的 code 顯而易見會輸出 FOOBAR。

現在因為某些原因 function bar 被改為

async function bar() {
return "BAR";
}

又因為某些原因我不能動到 function main。
所以我能調整的只有 function foo。
閣下可以示範一下要如何調整 function foo 讓程式繼續輸出 FOOBAR 嗎?
如果可以的話我真的會非常感謝。

ea753dc3 No.145

>>144
你這問題就像在問: 怎麼用鼻子吸義大利麵才能把義大利麵吸得好吃又不嗆鼻
因為鼻子就他媽不是設計來給你吃義大利麵的


function foo(r) {
return "FOO" + r;
}

async function bar() {
return "BAR";
}

function main() {
bar().then(
(r)=>console.log(foo(r))
)
}

main()



es8以後的async跟await本來就是太多人靠北promise難寫, 才搞個語法糖
就你這個case而言也沒多複雜, 一個promise then就能搞定的事情
要享受異步工作的好處又不想改程式碼, 這麼難伺候?

這個問題就在於bar是有什麼異步的工作要處理?
bar改成async本來整個作業流程就要跟著調整
上面最簡單的方法就是foo小改
main加上promise chain
也不用汙染到全部都是async

01f6f08c No.146

>>145
所以你的回答是
"不能這樣做,如果你呼叫了 async/await function,重寫整個 calling chain 是理所當然的事。op 的問題根本就不算是個問題,用人家的 lib 抓資料省了多少的功夫,改程式去配合人家,應該應該。"
對吧?

那你的回答跟 >>140 的"沒有。"有什麼差別呢?
他還補充了可以透過 thread 去同步,把 async function 包裝成一般的 function。

然後問題也不是 case 複不複雜或是 function bar 要處理什麼,而是這個 case 表示一個設計上的失誤,且對這個失誤沒什麼彌補的方法,對應的方式就是重新設計。
我看你嗆的這麼意氣風發還以為是 promise object 有什麼招數可以避開這個問題,害我興奮了一下,白洗了一件褲子。

ea753dc3 No.147

>>146
還在thread同步、設計失誤
這種智障發言你還是去重修OS吧
js的async根本就與thread無關
講白了js的async機制沒有multithreading也可以做

2469ff1d No.148

原PO就已經提到then了
他的意思就是他不想要async/await也不想要then,也就是也不想要promise
所以想當然的答案就是"拍謝不可能"/"除非你自幹await"
要嗆也要把別人的文看清楚再嗆好不好

而且async/await是比promise還要新,用來解決promise的callback地獄的
然後你還叫人家走回頭路…

ea753dc3 No.149

140在js講同步join thread我就快笑死了
146還出來大肆贊同
八成是只有寫過java或c++的半吊子
連JS engine是怎麼實做的都不知道
在那邊扯thread裝逼

ES的語境從來就沒有thread
ES的async也不是透過multithreading來達成
在ES中的thread只有webworker, 是靠瀏覽器支援的, 跟那一系列webXXXX的feature一樣都需要引擎方支援

ea753dc3 No.150

>>148
我開頭就應該說要用then啦
至於不想要await/async, 你本來就不需要把整個專案到處亂改, 你event的callback本來就會有一條處理路徑, 亂擴散本來就是撰寫者自己不知道在寫三小; 能改一個function的事情, 你為了一個語法糖去改幾十行, 搞清楚欸, 語法糖是讓你方便不是讓你自找麻煩耶

我主要就是嗆139跟140, 140的裝逼如果看不出來說明你的程度差不多啦

139的問題是什麼, 139講fire and forget
promise要用callback, 為什麼要reject跟resolve
就是要你做error handling
元PO描述的問題就是a->b->c這樣chaining的問題, 是要怎麼fire and forget, 就是因為有依賴性才要做chaining

如果你能改一行用then就能解決, 就不需要為了實現chaining去把所有function搞成async, 不是說語言有比較新的特性就要全部用新特性來幹, 根本兩碼子事

6e1d67f1 No.151

>>150
promise callback改寫成async/await要處理錯誤就是普通的try/catch,大多數程式語言的callback不會依程式碼追蹤,用callback要除錯反而困難。

>> a->b->c這樣chaining的問題, 是要怎麼fire and forge

可以用Signal或Event自找麻煩

如果不喜歡promise和async/await還可以選擇functional programming。

如果是多人專案就應該統一,沒人會想看你亂搞,140的意思就是要你重寫。

15004c9e No.152

看來大家對一開始的問題應該有共識了
「對,沒辦法,就是必須整個project改」
「要嘛塞滿async/await要嘛塞滿promise/then,這個語言就不是設計來讓你純sync的」



[Go to top] [Catalog] [Return][Post a Reply]
Delete Post [ ]
[ 首頁 / 搜尋 / 管理Discord ] [ Komica首頁 ] [ 跨版面 ] [ 雜談 / / 攝影 / 運動 ] [ 人工智慧 / 程設交流 ] [ 蔚藍檔案 / 英雄聯盟 / 米哈遊 / Minecraft / 魔物獵人 / 勝利女神:妮姬 / Pokémon / 刀劍亂舞 ]