相当于 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
框架中 Future
或 Task
——而是使用本地语言原语。
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
, trio
、curio
或其他。并非所有 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.
在 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
框架中 Future
或 Task
——而是使用本地语言原语。
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
, trio
、curio
或其他。并非所有 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.