leetcode2650. 设计可取消函数 generator和Promise

server/2024/11/24 5:06:18/

题目描述:

有时候你会有一个长时间运行的任务,并且你可能希望在它完成之前取消它。为了实现这个目标,请你编写一个名为 cancellable 的函数,它接收一个生成器对象,并返回一个包含两个值的数组:一个 取消函数 和一个 promise 对象。

你可以假设生成器函数只会生成 promise 对象。你的函数负责将 promise 对象解析的值传回生成器。如果 promise 被拒绝,你的函数应将该错误抛回给生成器。

如果在生成器完成之前调用了取消回调函数,则你的函数应该将错误抛回给生成器。该错误应该是字符串 “Cancelled”(而不是一个 Error 对象)。如果错误被捕获,则返回的 promise 应该解析为下一个生成或返回的值。否则,promise 应该被拒绝并抛出该错误。不应执行任何其他代码。

当生成器完成时,您的函数返回的 promise 应该解析为生成器返回的值。但是,如果生成器抛出错误,则返回的 promise 应该拒绝并抛出该错误。

下面的示例展示了你的代码会如何被使用:

function* tasks() {const val = yield new Promise(resolve => resolve(2 + 2));yield new Promise(resolve => setTimeout(resolve, 100));return val + 1; // calculation shouldn't be done.
}
const [cancel, promise] = cancellable(tasks());
setTimeout(cancel, 50);
promise.catch(console.log); // logs "Cancelled" at t=50ms

相反,如果 cancel() 没有被调用或者在 t=100ms 之后才被调用,那么 promise 应被解析为 5 。

思路

题目要求:

  1. 返回可取消函数
  • 调用取消函数抛出“Cancelled”给生成器(generator.throw(“Cancelled”))
  • 解析promise为生成器下一个的value(resolve(generator.next()))
  • 如果发生错误,promise 应该被拒绝并抛出该错误 (reject(err))
  1. 返回Promise
  • 将生成器的 promise 对象解析的值传回生成器(generator.next(ResolvedLastValue)
  • 如果 promise 被拒绝,应将该错误抛回给生成器(Promise.throw(err))
  • 生成器完成时,您的函数返回的 promise 应该解析为生成器返回的值。
  • 如果生成器抛出错误,则返回的 promise 应该拒绝并抛出该错误。

一步一步实现要求就好,对generator不熟悉也可以看看我之前的一篇博客
需要注意的是生成器每次返回的值都是Promise对象,需要等待其完成异步操作

代码

while迭代

var cancellable = function (generator) {let cancel = () => {};const promise = new Promise(async (resolve, reject) => {cancel = async () => {try {//抛出“Cancelled”给生成器let nextGenerator = generator.throw("Cancelled");//解析promise为生成器下一个的valueresolve(await nextGenerator.value); } catch (cancelError) {//拒绝并抛出该错误reject(cancelError);}};try {let nextGenerator  = generator.next();while (!nextGenerator.done) {try {const resolvedVal = await nextGenerator.value; //注意这里的异步// promise 对象解析的值传回生成器nextGenerator  = generator.next(resolvedVal);} catch (err) {//该Promise错误抛回给生成器nextGenerator  = generator.throw(err)}}//返回的 promise 解析为生成器返回的值。resolve(await nextGenerator.value);} catch (generatorError) {//生成器抛出错误,则返回的 promise 应该拒绝并抛出该错误。reject(generatorError);}});return [cancel, promise];
};

http://www.ppmy.cn/server/144448.html

相关文章

.net 7.0 解决“The keyword field is required”的问题

在 .net 3.1项目的时候,使用 keyword 做 API 接口的模糊匹配,能够传入keyword “” 进行整表查询。但当我在 .net 7.0 项目中这么使用的时候,传入 keyword 不为空时能够进行匹配,但是当我传入 keyword “” 的时候就报错 “The …

Consumer Group

不,kafka-consumer-groups.sh 脚本本身并不用于创建 Consumer Group。它主要用于管理和查看 Consumer Group 的状态和详情,比如列出所有的 Consumer Group、查看特定 Consumer Group 的详情、删除 Consumer Group 等。 Consumer Group 是由 Kafka 消费者…

Nexus搭建go私有仓库,加速下载go依赖包

一、搭建go私库 本文我们梳理一下go依赖包的私库搭建以及使用。 它只分为proxy和group两种仓库,这一点和maven仓库有所不同。 1、创建Blob Stores 为了区分不同的私库依赖包,存储的位置分隔开。 2、新建go proxy官网 Remote storage:htt…

集群聊天服务器(13)redis环境安装和发布订阅命令

目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…

数造科技亮相第26届高交会并接受媒体采访,以数据智能赋能未来

11 月 14 日至 16 日,第二十六届中国国际高新技术成果交易会(简称“高交会”)在深圳成功举办。本届大会以“科技引领发展,产业融合聚变”为主题,汇聚了全球最新的科技成果,打造了一场科技界的盛大聚会。 在…

神经网络问题之二:梯度爆炸(Gradient Explosion)

梯度爆炸(Gradient Explosion)是神经网络训练过程中常见的一个问题,它指的是在反向传播过程中,梯度值变得非常大,超出了网络的处理范围,从而导致权重更新变得不稳定甚至不收敛的现象。 一、产生原因 梯度爆…

uniapp的renderjs使用

‌uniapp中的RenderJS主要服务于APP和H5平台,其作用包括降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力,以及在视图层操作DOM和运行Web的JS库‌。 RenderJS是uni-app中一个特性,它允许开发者在页面中使用JavaScript直接渲…

Jetpack Compose 生命周期介绍

文章目录 前言1、Compose UI 的生命周期是什么?Compose 生命周期与传统生命周期的对比 2、各阶段详细解析2.1 初次 Composition:UI 的出生2.2 Recomposition(UI 更新)2.3 Disposal(资源清理)2.4 生命周期管…