4 回答

TA貢獻1828條經(jīng)驗 獲得超4個贊
承諾不會使任何事情異步,所以你是對的,在你所展示的代碼中使用承諾是沒有意義的。
Promise 的目的是提供一種標準的、可組合的方法來觀察異步事物(如 ajax 調用)的結果。
使用標準化方法來觀察異步操作的結果至少有三個巨大的好處:
我們可以使用標準語義來使用各個 Promise,而不是每個 API 都為回調函數(shù)定義自己的簽名。(它是否使用成功時的初始參數(shù)發(fā)出錯誤信號
null
,如 Node.js?它是否使用帶有成功標志的對象調用回調?或者...)我們可以有標準的方式來組合它們,例如
Promise.all
、Promise.race
、Promise.allSettled
等。我們可以使用語法來使用通常的控制結構來使用它們,這些控制結構現(xiàn)在以
async
函數(shù) 和 的形式存在await
。
但同樣,在同步過程中拋出一個承諾幾乎永遠不會做任何有用的事情。2
1 一個非常小的警告:附加到 Promise 的處理函數(shù)總是異步觸發(fā),無論 Promise 是否已經(jīng)解決。
2 另一個小警告:有時,您希望將同步結果包含在Promise.all
具有各種異步操作的組合操作(等)中。在這種情況下,將值包裝在立即履行的 Promise 中是有用的 - 事實上,所有標準 Promise 組合器(Promise.all
等)都會為您執(zhí)行此操作,就像 一樣await
。

TA貢獻1802條經(jīng)驗 獲得超5個贊
這是如何使用 Promise 的更好示例嗎?這就是我能想到的讓它對我有用的全部:
版本1
function getData() {
fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(data => data.json())
.then(json => console.log(json))
}
function logInfo() {
console.log("i am a logger")
}
getData()
logInfo()
// "I am a logger"
// {"test": "json"}
版本2
function getData() {
return fetch('https://jsonplaceholder.typicode.com/todos/1')
.then(data => data.json())
.then(json => console.log(json))
}
function logInfo() {
console.log("i am a logger")
}
getData().then(logInfo);
// "{"test": "json"}
// "I am a logger"
// waits for API result to log _then_ logInfo is run , which makes a log statement

TA貢獻1864條經(jīng)驗 獲得超2個贊
使用 Promise 肯定有好處,但這只是在某些情況下,它們的使用似乎可行。
您的示例可以表示當您同步從外部源檢索數(shù)據(jù)時會發(fā)生什么,它會阻止線程執(zhí)行進一步的代碼,直到循環(huán)終止(我在下面解釋為什么會發(fā)生這種情況) - 將其包裝在承諾中不會給出不同的輸出因為線程仍然被阻塞,并且當必須處理隊列中的下一條消息時,它會在結束后立即像平常一樣進行處理。
然而,與此類似的實現(xiàn)可以實現(xiàn)以非阻塞方式運行的 while 循環(huán),這只是一個想法(并不意味著用 setInterval 的實現(xiàn)來破壞這個主題):
let f = () => {
let tick = Date.now;
let t = tick();
let interval = setInterval(() => {
if (tick() - t >= 3000) {
console.log("stop");
clearInterval(interval);
}
}, 0);
};
f()
console.log("start");
基本上,時間是在瀏覽器中的單獨線程中檢查/處理的,并且在調用堆棧變空之后,每次指定的時間用完而間隔尚未清除時都會執(zhí)行回調(因此 UI 功能不受影響)當前正在執(zhí)行的函數(shù)終止/結束或在堆棧中其上方的其他函數(shù)完成運行之后。我不知道這樣做對性能的影響,但我覺得這應該只在必要時使用,因為回調必須非常頻繁地執(zhí)行(超時為 0,盡管無論如何都不能保證為 0) 。
為什么會發(fā)生
我主要想澄清的是,雖然處理程序函數(shù)將被安排為異步執(zhí)行,但隊列中的每條消息都必須在下一條消息之前完全處理,并且在 while 循環(huán)執(zhí)行期間,事件中不能處理新消息因此,如果沒有 Promise,同樣的事情也會發(fā)生,那么涉及 Promise 是毫無意義的。
所以基本上答案是:
等待它解析()不是毫無意義嗎?
是的,在這種情況下這是毫無意義的。

TA貢獻1772條經(jīng)驗 獲得超5個贊
你所做的事情沒有任何意義,因為你的函數(shù)體只是一個阻塞循環(huán)。
要從 Promises 中獲益,請將其與執(zhí)行 IO 操作的 API 結合使用,例如 HTTP 請求或從磁盤讀取文件。
這些 API 傳統(tǒng)上都使用回調,現(xiàn)在大多基于 Promise。
任何使用基于 Promise 的函數(shù)的函數(shù)本身也應該是基于 Promise 的。這就是為什么您會在現(xiàn)代代碼中看到很多 Promise,因為 Promise 只需要在堆棧中的第 1 層使用,整個堆棧本質上就是異步的。
添加回答
舉報