当Axios请求被取消时,如何在Laravel中停止php脚本?

qacovj5a  于 2023-10-22  发布在  iOS
关注(0)|答案(2)|浏览(154)

我正在使用Laravel,VueJs和Axios进行实时搜索,所以每次用户输入一个新词时,之前的请求都会被取消。我的问题是,即使我使用cancel token(https://github.com/axios/axios#cancellation)取消了之前的请求,php脚本仍然在运行。
问:如果axios请求被取消,我如何停止php脚本?

我的Vuejs代码

  1. fetchData(query) {
  2. if(cancel != undefined)
  3. cancel(); // cancel the previous request
  4. axios.get("http://sample-link", {
  5. cancelToken: new CancelToken(function executor(c) {
  6. cancel = c;
  7. }),
  8. params: {
  9. query : query
  10. }
  11. }).then(response => {
  12. console.log(response);
  13. }).catch(error => {console.log(error.message)})
  14. }
  15. ...

我的PHP代码

  1. class SearchController extends Controller {
  2. public function Search(Request $request)
  3. {
  4. $query = $request->input('query');
  5. $accounts = Accounts::search($query, null, true, true)->get();
  6. return response()->json($accounts);
  7. }
  8. ...
  9. }
wn9m85ua

wn9m85ua1#

我不知道Axios取消是如何工作的,但如果客户端断开HTTP会话(应该),您可以尝试使用ignore_user_abort设置。

  1. public function Search(Request $request)
  2. {
  3. ignore_user_abort(false);
  4. $query = $request->input('query');
  5. $accounts = Accounts::search($query, null, true, true)->get();
  6. return response()->json($accounts);
  7. }

其他有用的功能可以是:
connection_status:检查连接的当前状态
connection_aborted:检查连接是否已取消
我只是想补充一点,你的函数看起来不是很密集,所以我不确定这样的检查有多有用。正如Tauqeer在评论中建议的那样,在这种情况下,通常的方法是对JavaScript搜索函数应用去抖动,以便仅在用户完成输入时才触发请求。
使用lodash的示例:

  1. const search = (query) => {
  2. .. your axios request ...
  3. }
  4. const fetchData = _.debounce(search, 300)

现在,只要用户键入内容,就可以调用fetchData(query),并且只有当用户停止键入300毫秒时,它才会发送请求

展开查看全部
l5tcr1uw

l5tcr1uw2#

我只是在我的控制器代码中通过connection_aborted()解决了这个问题。

  1. public function Search(Request $request)
  2. {
  3. if (connection_aborted()) {
  4. $data = "Request cancelled";
  5. return $data;
  6. }
  7. $query = $request->input('query');
  8. $accounts = Accounts::search($query, null, true, true)->get();
  9. return response()->json($accounts);
  10. }

相关问题