在方法 1 中,我希望先执行 try 块,然后再执行 call_ordercreate 方法,尝试使用 asyncio 但得到如描述中所示的错误输出,我该如何解决此问题?
方法#1
<?php
$str = "size:3|order_by:date|order:ASC|post_type:post";
$arr = array_reduce(explode('|', $str), function ($carry, $item) {
$itemArr = explode(':', $item);
if (count($itemArr) == 2) {
$carry[$itemArr[0]] = $itemArr[1];
return $carry;
}
}, []);
print_r($arr);
方法#2
@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():
if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
print("entered push")
call_ordercreate(thread_ts, user_name) **# Run this method after executing try block**
try:
return jsonify(
{
"response_action": "push",
"view": orderwaitmessage,
}
)
except SlackApiError as e:
code = e.response[ "error" ]
return make_response(f"Failed to open a modal due to {code}", 200)
错误输出
async def call_ordercreate(thread_ts, user_name):
await asyncio.sleep(4)
url_list1 = CONST_ORDERCREATE_API
r = requests.get(url)
答案 0 :(得分:0)
这里的问题是你试图从一个普通的同步函数调用一个异步函数。您应该使用 asyncio.run
方法来运行该函数。这不会引发 RuntimeWarning
。所以你的代码看起来像这样:
@app.route("/slack/message_actions", methods=[ "POST" ])
def message_actions():
if (payload[ "type" ] == "view_submission" and payload[ "view" ][ "callback_id" ] == "sthpush"):
print("entered push")
asyncio.run(call_ordercreate(thread_ts, user_name))
try:
return jsonify(
{
"response_action": "push",
"view": orderwaitmessage,
}
)
except SlackApiError as e:
code = e.response[ "error" ]
return make_response(f"Failed to open a modal due to {code}", 200)
但是,您似乎想在将响应返回给用户后运行 call_ordercreate
。恐怕这是不可能的,因为一旦您return
,整个请求上下文就会被破坏。此外,flask(我假设它的flask)是一个WSGI 服务器,这意味着它以同步方式处理请求。这就是为什么使用 asyncio.run
是调用异步函数的唯一方法。不足之处?它等待任务完成,这绝对不是你想要的。