python-3.x - 这个简单的 Promise-chaining JavaScript 类的有效 Python 等价物
问题描述
这是 JavaScript 代码:
class TaskQueue {
constructor() {
this._chain = Promise.resolve();
}
postTask(task) {
const result = this._chain.then(task);
this._chain = result.catch(() => {});
return result;
}
}
我很确定这只需要一个任务(函数),从中获取 Promise,忽略错误,并将其添加到类“链”中。不过,我不太确定为什么。这是有问题的文件,在这里您可以找到正在使用的文件。在使用中,对我来说似乎真的不需要排队系统。
我不知道在 Python 中做什么。我知道没有与这种 Python 代码风格等效的“精确”,但我想有效地复制它,或者至少达到与 JS 相同的结果,即使通过不同的方法。
解决方案
then
创建一个新的承诺,在旧承诺解决后运行。在 Python 中,您可以创建一个协程等待前一个协程的任务。就像是:
class TaskQueue:
def __init__(self):
fut = asyncio.get_event_loop().create_future()
fut.set_result(None)
self._task = fut
def post_task(self, awaitable):
async def run_awaitable(prev):
try:
await prev
await awaitable
except:
pass # consider at least logging here
self._task = asyncio.create_task(run_awaitable(self._task))
推荐阅读
- javascript - 如何有效地为对象存储价值
- powershell - 检测文件夹是否包含 Log 文件夹和 ps1 文件
- bookdown - 尝试在没有 gitbook 输出的情况下格式化 bookdown 书
- flutter - 如何从另一个提供者传递超过 1 个值的数据?
- c - 如何将 strcpy() 与数组元素一起使用?
- javascript - 新手问题:我只是在我的脚本中使用 decimal.js 时遇到了问题
- ruby - 如何在ruby中访问哈希值[2]的最小值
- java - 如何在 macOS 上使用 JavaFX 打开应用程序的新实例
- javascript - Laravel webpack npm run watch 只能运行一次
- php - GuzzleHttp 不显示来自 nodejs 服务器的响应