第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Promise 如何改變函數(shù)的使用

Promise 如何改變函數(shù)的使用

慕萊塢森 2023-12-14 15:11:35
我很難找到 Promise 的用途。下面這兩種方法的工作方式不是完全相同嗎?由于while循環(huán)loopTest()是同步的,logStatement()無(wú)論如何函數(shù)在完成之前都不會(huì)運(yùn)行,所以第二種方法會(huì)有什么不同..等待它是沒(méi)有意義的嗎resolve()?第一種方法:function loopTest() {   while ( i < 10000 ) {       console.log(i)       i++   })}function logStatement() {     console.log("Logging test")}loopTest();logStatement();第二種方法:function loopTest() {   return new Promise((resolve, reject) => {      while ( i < 10000 ) {          console.log(i)          i++          if (i === 999) {           resolve('I AM DONE')          }      })   });   }function logStatement() {     console.log("Logging test")}loopTest().then(logStatement());
查看完整描述

4 回答

?
明月笑刀無(wú)情

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊

承諾不會(huì)使任何事情異步,所以你是對(duì)的,在你所展示的代碼中使用承諾是沒(méi)有意義的。

Promise 的目的是提供一種標(biāo)準(zhǔn)的、可組合的方法來(lái)觀察異步事物(如 ajax 調(diào)用)的結(jié)果。

使用標(biāo)準(zhǔn)化方法來(lái)觀察異步操作的結(jié)果至少有三個(gè)巨大的好處:

  • 我們可以使用標(biāo)準(zhǔn)語(yǔ)義來(lái)使用各個(gè) Promise,而不是每個(gè) API 都為回調(diào)函數(shù)定義自己的簽名。(它是否使用成功時(shí)的初始參數(shù)發(fā)出錯(cuò)誤信號(hào)null,如 Node.js?它是否使用帶有成功標(biāo)志的對(duì)象調(diào)用回調(diào)?或者...)

  • 我們可以有標(biāo)準(zhǔn)的方式來(lái)組合它們,例如Promise.all、Promise.racePromise.allSettled等。

  • 我們可以使用語(yǔ)法來(lái)使用通常的控制結(jié)構(gòu)來(lái)使用它們,這些控制結(jié)構(gòu)現(xiàn)在以async函數(shù) 和 的形式存在await。

但同樣,在同步過(guò)程中拋出一個(gè)承諾幾乎永遠(yuǎn)不會(huì)做任何有用的事情。2


1 一個(gè)非常小的警告:附加到 Promise 的處理函數(shù)總是異步觸發(fā),無(wú)論 Promise 是否已經(jīng)解決。

2 另一個(gè)小警告:有時(shí),您希望將同步結(jié)果包含在Promise.all具有各種異步操作的組合操作(等)中。在這種情況下,將值包裝在立即履行的 Promise 中是有用的 - 事實(shí)上,所有標(biāo)準(zhǔn) Promise 組合器(Promise.all等)都會(huì)為您執(zhí)行此操作,就像 一樣await


查看完整回答
反對(duì) 回復(fù) 2023-12-14
?
慕后森

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊

這是如何使用 Promise 的更好示例嗎?這就是我能想到的讓它對(duì)我有用的全部:


版本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


查看完整回答
反對(duì) 回復(fù) 2023-12-14
?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

使用 Promise 肯定有好處,但這只是在某些情況下,它們的使用似乎可行。


您的示例可以表示當(dāng)您同步從外部源檢索數(shù)據(jù)時(shí)會(huì)發(fā)生什么,它會(huì)阻止線程執(zhí)行進(jìn)一步的代碼,直到循環(huán)終止(我在下面解釋為什么會(huì)發(fā)生這種情況) - 將其包裝在承諾中不會(huì)給出不同的輸出因?yàn)榫€程仍然被阻塞,并且當(dāng)必須處理隊(duì)列中的下一條消息時(shí),它會(huì)在結(jié)束后立即像平常一樣進(jìn)行處理。


然而,與此類似的實(shí)現(xiàn)可以實(shí)現(xiàn)以非阻塞方式運(yùn)行的 while 循環(huán),這只是一個(gè)想法(并不意味著用 setInterval 的實(shí)現(xiàn)來(lái)破壞這個(gè)主題):


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");

基本上,時(shí)間是在瀏覽器中的單獨(dú)線程中檢查/處理的,并且在調(diào)用堆棧變空之后,每次指定的時(shí)間用完而間隔尚未清除時(shí)都會(huì)執(zhí)行回調(diào)(因此 UI 功能不受影響)當(dāng)前正在執(zhí)行的函數(shù)終止/結(jié)束或在堆棧中其上方的其他函數(shù)完成運(yùn)行之后。我不知道這樣做對(duì)性能的影響,但我覺(jué)得這應(yīng)該只在必要時(shí)使用,因?yàn)榛卣{(diào)必須非常頻繁地執(zhí)行(超時(shí)為 0,盡管無(wú)論如何都不能保證為 0) 。

為什么會(huì)發(fā)生

我主要想澄清的是,雖然處理程序函數(shù)將被安排為異步執(zhí)行,但隊(duì)列中的每條消息都必須在下一條消息之前完全處理,并且在 while 循環(huán)執(zhí)行期間,事件中不能處理新消息因此,如果沒(méi)有 Promise,同樣的事情也會(huì)發(fā)生,那么涉及 Promise 是毫無(wú)意義的。

所以基本上答案是:

等待它解析()不是毫無(wú)意義嗎?

是的,在這種情況下這是毫無(wú)意義的。


查看完整回答
反對(duì) 回復(fù) 2023-12-14
?
月關(guān)寶盒

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊

你所做的事情沒(méi)有任何意義,因?yàn)槟愕暮瘮?shù)體只是一個(gè)阻塞循環(huán)。

要從 Promises 中獲益,請(qǐng)將其與執(zhí)行 IO 操作的 API 結(jié)合使用,例如 HTTP 請(qǐng)求或從磁盤讀取文件。

這些 API 傳統(tǒng)上都使用回調(diào),現(xiàn)在大多基于 Promise。

任何使用基于 Promise 的函數(shù)的函數(shù)本身也應(yīng)該是基于 Promise 的。這就是為什么您會(huì)在現(xiàn)代代碼中看到很多 Promise,因?yàn)?Promise 只需要在堆棧中的第 1 層使用,整個(gè)堆棧本質(zhì)上就是異步的。


查看完整回答
反對(duì) 回復(fù) 2023-12-14
  • 4 回答
  • 0 關(guān)注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)