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

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

此 Promise 取消實現是否用于在正確的軌道上減少異步可迭代?

此 Promise 取消實現是否用于在正確的軌道上減少異步可迭代?

嚕嚕噠 2022-09-29 17:44:16
我想為我的庫的一種方法啟用 Promise 取消。我只對取消異步迭代的承諾感興趣,因為這些承諾很有可能無限期地掛起。reduceconst reduceAsyncIterable = async (fn, possiblyX0, state, x) => {  const iter = x[Symbol.asyncIterator]()  const y0 = isUndefined(possiblyX0) ? (await iter.next()).value : possiblyX0  if (isUndefined(y0)) {    throw new TypeError('reduce(...)(x); x cannot be empty')  }  let y = await fn(y0, (await iter.next()).value)  for await (const xi of iter) {    if (state.cancelled) return // stops async iterating if `cancel` called    y = await fn(y, xi)  }  return y}const reduce = (fn, x0) => {  if (!isFunction(fn)) {    throw new TypeError('reduce(x, y); x is not a function')  }  return x => {    if (isIterable(x)) return reduceIterable(fn, x0, x)    if (isAsyncIterable(x)) {      const state = { cancelled: false, resolve: () => {} }      const p = new Promise((resolve, reject) => {        state.resolve = resolve        reduceAsyncIterable(fn, x0, state, x).then(          y => state.cancelled || resolve(y)        ).catch(reject)      })      p.cancel = () => { state.cancelled = true; state.resolve() } // shortcircuit the Promise `p` on `cancel` call      return p    }    if (is(Object)(x)) return reduceObject(fn, x0, x)    throw new TypeError('reduce(...)(x); x invalid')  }}上面的代碼似乎有效,但我不禁覺得這里有內存泄漏。特別是,在 和 。如果這些等待語句需要永遠(它們可能用于異步迭代器),則可能永遠不會返回。從用戶的角度來看,這很好,因為在 中發生了短路,因為用戶看到的承諾已解決。但從計算機的角度來看,取消此操作的承諾會導致內存泄漏嗎?await iter.next()for await (const xi of iter)reduceAsyncIterablereduce我希望能夠在返回的承諾上使用該函數,如下所示:cancelconst myOngoingTaskPromise = reduce(someReducer, null)(myInfiniteAsyncIterable)myOngoingTaskPromise.cancel() // resolves myOngoingTaskPromise with undefinedmyOngoingTaskPromise // Promise { undefined }
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

我找到了這條路,就像一個秘密武器什么的Promise.race


    if (isAsyncIterable(x)) {

      const state = { cancel: () => {} }

      const cancelToken = new Promise((_, reject) => { state.cancel = reject })

      const p = Promise.race([

        reduceAsyncIterable(fn, x0, x),

        cancelToken,

      ])

      p.cancel = () => { state.cancel(new Error('cancelled')) }

      return p

    }

無內存泄漏

http://img1.sycdn.imooc.com//633569150001d47e14860797.jpg

查看完整回答
反對 回復 2022-09-29
  • 1 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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