use*_*371 9 javascript python promise
我试图了解什么是最好的代码结构或设计模式,可以执行以下操作:
有一个名为的函数get_data将启动套接字连接并开始等待将返回一些数据的特定套接字事件。一旦获得数据,只有该get_data函数才应该返回。
所以在 JS 中,它会非常简单,如下所示:
(请记住,此代码片段只是一个示例,并不意味着是一个工作代码)
const getData = async ()=>{
return new Promise((resolve, reject)=>{
const socket = socket()
socket.on("message", (data)=>{
resolve(data)
})
socket.connect("localhost")
});
}
const parseData = async () => {
const data = await getData()
// do something with the data
}
Run Code Online (Sandbox Code Playgroud)
然而,对于Python,我完全不知道如何达到相同的结果。
我如何将它翻译成Python?这里会使用什么策略?
我现在能想到的唯一办法是这样的:
def get_data():
socket = socket()
my_data = None
@socket.event
def message(data):
nonlocal my_data
my_data = data
socket.connect("localhost")
while not my_data:
time.sleep(0.3)
socket.disconnect()
return my_data
def parse_data():
data = get_data()
# do something with the data
Run Code Online (Sandbox Code Playgroud)
use*_*170 10
如果您想将基于回调的 API 转换为 API async,您\xe2\x80\x99 可能正在寻找asyncio.Future.
稍微修改一下你的稻草人代码:
\nimport asyncio\n\ndef get_data():\n # create a future\n future = asyncio.Future()\n\n # create a socket\n socket = socket()\n\n # connect callbacks\n @socket.on("message")\n def on_message(data):\n future.set_result(data)\n\n @socket.on("error")\n def on_error(error):\n future.set_exception(error)\n\n # create a background task that will communicate with the socket\n # and invoke the callbacks\n @asyncio.create_task\n async def communicate():\n socket.connect(\'localhost\')\n socket.communicate()\n\n # return the future\n return future\nRun Code Online (Sandbox Code Playgroud)\n调用get_data将返回一个对象,您可以像函数调用await一样:async
async def parse_data():\n data = await get_data()\n # process further\nRun Code Online (Sandbox Code Playgroud)\n