這個問題在這里已經有了答案: 如何從異步呼叫中回傳回應 43 個答案 將異步/回呼方法轉換為阻塞/同步方法 3 個答案 2 小時前關閉。
我知道阻塞事件回圈是不好的,以及它的后果。但即使是原生 fs 模塊也為某些目的提供了一些同步功能,例如 CLI 使用fs.readFileSync.
我想將以下異步等待代碼轉換為阻塞代碼。
let value = undefined;
function setup() {
return new Promise((resolve) => {
setTimeout(() => {
value = "**value**";
resolve();
});
});
}
// need to convert below function to blocking
async function getValue() {
await setup();
return value;
}
console.log(await getValue()); // top level await OK
假設它是阻塞的,我們可以這樣稱呼它
getValue(); // without await or .then
我試過這樣。但它不起作用。
function getValue() {
setup();
while (!value) {
// wait until we get value
}
return value;
}
console.log(getValue())
我怎樣才能做到這一點?
(這fs.readFileSync是阻塞。有什么方法可以使用 readFileSync 使用的技術)
編輯
Related thread: Convert asynchronous/callback method to blocking/synchronous method
uj5u.com熱心網友回復:
我怎樣才能做到這一點?
你改變語言。
說真的:JavaScript(或多或少,有很多警告)是單執行緒的。您的回呼代碼應該由您打算阻止的同一執行緒處理。
你沒有辦法做到這一點:這是不可能的。
因此,您要么更改您的語言(在 C# 或 Java 中,您可以啟動一個執行緒并根據需要阻止它,而其他執行緒做一些作業),或者您更改需求。
我懷疑最后一個選項是您所謂的問題的真正解決方案。現在,你真正需要做什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/455010.html
標籤:javascript node.js asynchronous
