首页 > 解决方案 > 这个简单的 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 相同的结果,即使通过不同的方法。

标签: python-3.xpromisequeuepython-asyncio

解决方案


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))

推荐阅读