天天看點

JQuery Deferred對象使用小結

場景描述

如下,打開頁面時,擷取預設選中的項目,同時也會初始化Combobox下拉框下拉清單資料

JQuery Deferred對象使用小結

問題描述

擷取預設選中項目及下拉清單的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');                

結果打開頁面時,控制台提示如下:

JQuery Deferred對象使用小結

原因很簡單,

以上代碼getProjects函數調用,會引發get請求。

緊接着,開始執行後續的代碼,涉及到jsonData的引用,但是此時,請求可能還沒傳回結果,也就是說getProjects 還沒傳回資料給jsonData,jsonData未定義。

解決方案

讓這兩個檔案中的代碼“同步”運作。

    var defer = $.Deferred(); //傳回Deferred對象;

        defer.resolve(jsonData);

    return defer;

getProjects('TestProject').then(function(jsonData) {

        $('#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是傳遞給回調函數的參數。

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

JQuery Deferred對象使用小結
JQuery Deferred對象使用小結
JQuery Deferred對象使用小結