亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“退貨等待承諾”與“退貨承諾”之間的區別

“退貨等待承諾”與“退貨承諾”之間的區別

牛魔王的故事 2019-11-14 09:50:48
給定下面的代碼示例,行為上是否有任何差異,如果有,這些差異是什么?return await promiseasync function delay1Second() {  return (await delay(1000));}return promiseasync function delay1Second() {  return delay(1000);}據我了解,第一個將在異步函數內進行錯誤處理,并且錯誤會冒出異步函數的Promise。但是,第二個需要較少的滴答聲。這個對嗎?該片段只是一個返回Promise供參考的常用功能。function delay(ms) {  return new Promise((resolve) => {    setTimeout(resolve, ms);  });}
查看完整描述

3 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

在大多數情況下,return和之間沒有可觀察到的差異return await。這兩個版本的delay1Second觀察行為完全相同(但根據實現的不同,該return await版本可能會使用更多的內存,因為Promise可能會創建一個中間對象)。


但是,正如@PitaJ指出的,在一種情況下存在差異:如果returnor return await嵌套在try- catch塊中??紤]這個例子


async function rejectionWithReturnAwait () {

  try {

    return await Promise.reject(new Error())

  } catch (e) {

    return 'Saved!'

  }

}


async function rejectionWithReturn () {

  try {

    return Promise.reject(new Error())

  } catch (e) {

    return 'Saved!'

  }

}

在第一個版本中,異步函數在返回結果之前等待被拒絕的承諾,這將導致拒絕變成異常并到達catch子句。因此,該函數將返回一個解析為字符串“ Saved!”的promise。


但是,該函數的第二個版本確實直接返回了被拒絕的承諾,而無需在async函數中等待它,這意味著不調用該catch案例,而是由調用者獲取拒絕。


查看完整回答
反對 回復 2019-11-14
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

這是一個很難回答的問題,因為在實踐中,這取決于您的編譯器(可能babel)實際渲染的方式async/await。清楚的是:

  • 盡管第一個實現的鏈中可能少一個,但兩個實現的行為應相同Promise。

  • 特別是如果您刪除了不必要的await,則第二個版本將不需要編譯器提供任何額外的代碼,而第一個版本則需要。

因此,從代碼性能和調試的角度來看,第二個版本是可取的,盡管只是略微如此,而第一個版本具有一點易讀性,因為它清楚地表明它返回了承諾。


查看完整回答
反對 回復 2019-11-14
  • 3 回答
  • 0 關注
  • 266 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號