相当于 python 中的 js then()?

Equivalent of js then() in python?

在 Typescript 中我习惯这样写异步代码:

async function foo()  // returns a promise
    return new Promise<string>( resolve, reject) {
       resolve('Hello!');
    });

async function bar() {
  s: string  = await foo();
}

async function baz() {
   foo().then((s: string) { alert(s); }

我将如何在 python (>= 3.7.0) 中执行此操作? 我想这是正确的:

async def bar:
    await s = foo()

但是 foo()baz() 的 python 等价物呢?我将如何写它们?我应该使用 concurrent.futures.Future 对象吗?如果可以,怎么做?

Python async/await 语法真的很像 ECMAScript async/await 语法。没有 .then() 的等价物,就像在 ES 中不需要 .then() 和 async/await 一样。

等效的异步 Python 代码将是(bar() 被省略,因为它什么也没做):

import asyncio

async def foo():
    return 'Hello!'

async def baz():
    s = await foo()
    print(s)

asyncio.run(baz())

Python 的 async 支持是 隐藏 可等待对象的语法糖,而不是暴露它们。因此,人们通常不会显式地使用 JS Promise 的等价物——在大多数 async 框架中 FutureTask——而是使用本地语言原语。

async def foo():
    return "Hello!"  # async function returns directly

async def bar():
    s = await foo()  # async function is await'ed

async def baz():
    print(await foo())  # await function to "then" use its result

以上代码只是原生原语,因此在 all Python async 框架中有效,无论是 asyncio, triocurio 或其他。并非所有 async 框架都支持显式地与 Promise 交互以添加回调——事实上,many are explicitly designed to reject this notion.


asyncio 框架允许向两个 Future and Task 对象添加回调,它们表示 first-class 并发操作(类似于线程)。此类操作通常不是async本身,可以通过常规函数完成。

import asyncio

def qux():
    footure = asyncio.create_task(foo())
    footure.add_done_callback(lambda foot: print(f"The future said {foot.result()}"))
    return footure

请注意,虽然 asyncio 公开了此功能,但它被认为是 low-level use-cases 独有的。

add_done_callback(callback, *, context=None)

Add a callback to be run when the Task is done.

This method should only be used in low-level callback-based code.