我想為我的庫的一種方法啟用 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 }
此 Promise 取消實現是否用于在正確的軌道上減少異步可迭代?
嚕嚕噠
2022-09-29 17:44:16