在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java  HTML/ await沒有返回

await沒有返回

let p = new Promise(resolve => {})

const noReturn = async function() {
  const res = await p()
  return res
}

某處多次調用noReturn方法,會不會有什么不好的影響?

回答
編輯回答
挽歌

p到底是Promise,還是是函數?如果pPromise,會有不好的影響,否則不會。

當前V8的Promise的實現,會在滿足以下條件的時候回收掉所有.then鏈的上下文

  1. resolve沒人要了
  2. reject也沒人要了
  3. ??!Promise對象也沒人要了

所以以下代碼完全沒有問題,所有東西都會被正確回收

let collectable = (async () => {
  const buf = new Uint8Array(1024 * 1024 * 1024);
  for (let i = 0; i < buf.length; i++) buf[i] = i;
  await new Promise(() => { });
  return buf;
})();
if (typeof gc == 'function') gc();

上面的代碼中,1和2滿足,因為沒有變量存著那個空Promise,所以3也滿足,所以async內的所有上下文都被釋放,collectable只剩下了空殼Monad,薛定諤的貓早跑掉了。

而這段代碼會造成內存泄漏

let deadPromise = new Promise(() => { });
let uncollectable = (async () => {
  const buf = new Uint8Array(1024 * 1024 * 1024);
  for (let i = 0; i < buf.length; i++) buf[i] = i;
  await deadPromise;
  return buf;
})();
if (typeof gc == 'function') gc();

上面的代碼會造成內存泄漏,只有deadPromise = null之后才能回收。


一點后話,我猜題主也是在想,如果我們沒有AbortablePromise,那我們至少能明確標示出一個Promise可以被垃圾回收吧?幸運的是,我們可以,但是要用到上面這樣的hack。

不過,現在我們有AbortController了,說明社區(qū)已經基本上對AbortablePromise怎么實現有了共識:應該throw出去。這樣的話,我們就不應該用這樣的hack了,而應該與fetch它們保持一致。

2017年2月9日 20:10
編輯回答
硬扛

會,從代碼看(我覺得是示例代碼沒寫好的原因吧),大量的promise處于pending狀態(tài),一是gc沒法回收,二是event loop每個階段之間都要檢查promise。

2018年1月18日 08:49