就我們做知,ajax強大之處在於它的異步請求,但是有時候我們需要ajax執行徹底完成之后再執行其他函數或操作
這個時候往往我們用到ajax的回調函數,但是假如你不想或者不能把接下來的操作寫在回調函數中,怎么辦?
以jquery.page.js插件為例,分頁初始化如下:
$(".tcdPageCode").createPage({ pageCount:100, current:1, backFn:function(p){ //console.log(p); } });
這里pageCount總頁數我需要從后台動態獲取,也就是需要ajax請求接口后返回的值
一開始我把分頁初始化的這段代碼寫在ajax的回調函數中
function getRecourcesAction(result) { if (result != null) { $(".tcdPageCode").createPage({ pageCount: result.pageCount, current: nowPage, backFn: function (p) { pageNo=p-1; nowPage=p; getRecources(getRecourcesAction); } }); var html = template('recources', { list: result.data }); $("#recource li").remove(); $("#recource").append(html); } else { layer.open({ title: '提示', content: "資源查詢失敗!" }); } }
因為backFn中會繼續請求,所以會重復創建,上一頁、下一頁翻頁時會出現連續跳頁的情況,最后超出總頁數而溢出出錯
解決辦法:
設置全局變量pageCount,先進行ajax請求,得到返回的總頁數后賦值給pageCount,然后再進行初始化分頁。注意:ajax請求時,設置async: false(默認為true),進行同步請求,即Ajax請求將整個瀏覽器鎖死,只有請求結束后才能執行其他操作,否則pageCount值還未返回就先初始化分頁了。
$(function(){ getRecources(getRecourcesAction); //初始化頁面(資源初始化) //初始化分頁 $(".tcdPageCode").createPage({ pageCount: pageCount, current: nowPage, backFn: function (p) { pageNo=p-1; nowPage=p; getRecources(getRecourcesAction); } }); });