場景描述 如下,打開頁面時,獲取預設選中的項目,同時也會初始化Combobox下拉框下拉列表數據 問題描述 獲取預設選中項目及下拉列表的js函數位於common.js文件,類似如下: // 根據項目類型,獲取對應的項目 function getProjects(projectType) { // 請 ...
場景描述
如下,打開頁面時,獲取預設選中的項目,同時也會初始化Combobox下拉框下拉列表數據
問題描述
獲取預設選中項目及下拉列表的js函數位於common.js文件,類似如下:
// 根據項目類型,獲取對應的項目
function getProjects(projectType) {
// 請求已有已啟用項目
$.get('/action/getProjects?projectType=' + projectType, function(data,status) {
var jsonData = JSON.parse(data);
return jsonData;
});
}
js函數調用代碼位於另一個html文件--testTaskManager.html,<script></script>元素標簽內。
如下
// 初始化項目combobox下拉列表
var jsonData = getProjects('TestProject');
console.log(jsonData);
if (jsonData['result'] == 'success') {
$('#projects').combobox('loadData', jsonData['data']);
} else {
$.messager.alert('錯誤信息', '獲取項目失敗:' + jsonData['data'], 'error');
}
結果打開頁面時,控制台提示如下:
原因很簡單,
var jsonData = getProjects('TestProject');
以上代碼getProjects函數調用,會引發get請求。
緊接著,開始執行後續的代碼,涉及到jsonData的引用,但是此時,請求可能還沒返回結果,也就是說getProjects 還沒返回數據給jsonData,jsonData未定義。
解決方案
讓這兩個文件中的代碼“同步”運行。
function getProjects(projectType) {
var defer = $.Deferred(); //返回Deferred對象;
// 請求已有已啟用項目
$.get('/action/getProjects?projectType=' + projectType, function(data,status) {
var jsonData = JSON.parse(data);
defer.resolve(jsonData);
});
return defer;
}
// 初始化項目combobox下拉列表
getProjects('TestProject').then(function(jsonData) {
if (jsonData['result'] == 'success') {
$('#projects').combobox('loadData', jsonData['data']);
} else {
$.messager.alert('錯誤信息', '獲取項目失敗:' + jsonData['data'], 'error');
}
});
說明
以上代碼,大致意思就是先指定getProjects函數的的非同步操作,執行完成後才執行then函數中指定的回調函數。
done(fn)
fail(fn)
then(done, fail)
done, fail這兩個方法都用來綁定回調函數fn,fn可能是一個function,也有可能是多個以逗號分隔的function函數。
resolve(arg)
這個方法用來改變deferred對象的狀態為resolved, 並告訴deferred對象執行done回調,arg是傳遞給回調函數的參數。
reject(arg)
這個方法用來改變deferred對象的狀態為rejected,並告訴deferred對象執行done回調,arg是傳遞給回調函數的參數。