php - 取消 Axios 请求时如何在 Laravel 中停止 php 脚本?
问题描述
我正在使用 Laravel、VueJs 和 axios 进行实时搜索,所以每次用户输入一个新单词时,之前的请求都会被取消。我的问题是,即使我使用取消令牌(https://github.com/axios/axios#cancellation)取消上一个请求,php 脚本仍在运行。
问题:如果 axios 请求已被取消,我如何停止 php 脚本?
我的 Vuejs 代码
fetchData(query) {
if(cancel != undefined)
cancel(); // cancel the previous request
axios.get("http://sample-link", {
cancelToken: new CancelToken(function executor(c) {
cancel = c;
}),
params: {
query : query
}
}).then(response => {
console.log(response);
}).catch(error => {console.log(error.message)})
}
...
我的PHP代码
class SearchController extends Controller {
public function Search(Request $request)
{
$query = $request->input('query');
$accounts = Accounts::search($query, null, true, true)->get();
return response()->json($accounts);
}
...
}
解决方案
我不确切知道 Axios 取消是如何工作的,但是如果客户端断开 HTTP 会话(应该如此),您可以尝试使用该ignore_user_abort
设置。
public function Search(Request $request)
{
ignore_user_abort(false);
$query = $request->input('query');
$accounts = Accounts::search($query, null, true, true)->get();
return response()->json($accounts);
}
其他有用的功能可能是:
connection_status
:检查连接的当前状态
connection_aborted
: 检查连接是否被取消
我只想补充一点,您的功能似乎不是很密集,所以我不确定这样的检查有多大用处。正如 Tauqeer 在评论中建议的那样,在这些情况下,通常的方法是对您的 javascript 搜索函数应用去抖动,以便仅在用户完成输入时触发请求。
使用lodash的示例:
const search = (query) => {
.. your axios request ...
}
const fetchData = _.debounce(search, 300)
现在您可以在用户输入内容时调用fetchData(query)
,并且仅在用户停止输入 300 毫秒时发送请求
推荐阅读
- excel - 如果两列中的值匹配,则将第三列中的值插入第四列
- python - 如何使用 Python 纠正“'int' object is not iterable”错误?
- postgresql - 我可以相信 postgresql 中的每个更新语句都是原子的吗?
- javascript - 用户通过 cognito 身份验证后,如何通过用户凭据访问 s3 存储桶?
- kubernetes - 完整的 Kubernetes YAML 规范在哪里?
- firebase - firebase 云消息传递是否允许将推送通知定位到特定设备/用户等
- awk - Awk program creating very large negative number when trying to add up values from csv file
- python - Python:多处理正在使用不想要的值在函数中使用
- c# - 在 CustomException 中更新消息
- python - keras loss 和其他自定义 mertic 不准确