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

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

我正在使用Laravel,VueJs和Axios进行实时搜索,所以每次用户输入一个新词时,之前的请求都会被取消。我的问题是,即使我使用cancel token(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);
    }
    ...
}
wn9m85ua

wn9m85ua1#

我不知道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毫秒时,它才会发送请求

l5tcr1uw

l5tcr1uw2#

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

public function Search(Request $request)
{
    if (connection_aborted()) {
      $data = "Request cancelled";
      return $data;
    }
    $query = $request->input('query');
    $accounts = Accounts::search($query, null, true, true)->get();
    return response()->json($accounts);
}

相关问题