第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何確定 jquery ajax 調(diào)用何時(shí)完成?

如何確定 jquery ajax 調(diào)用何時(shí)完成?

梵蒂岡之花 2022-01-01 20:38:50
我有一個(gè)國(guó)家/地區(qū)下拉列表,并有一個(gè) jquery ajax 調(diào)用,該調(diào)用使用國(guó)家/地區(qū)名稱(chēng)填充下拉列表。問(wèn)題是我需要知道呼叫何時(shí)完成,然后才能確定選擇了哪個(gè)國(guó)家/地區(qū)。也就是說(shuō),我在使用 ajax 調(diào)用的函數(shù)之后調(diào)用的任何函數(shù)都被過(guò)早調(diào)用(在下拉列表填充之前),因此以下函數(shù)將崩潰。我也不想使用 async=false (因?yàn)檫@會(huì)導(dǎo)致更多問(wèn)題并且是不好的做法)。實(shí)現(xiàn)這一目標(biāo)的正確方法是什么?這是一個(gè)通用的 ajax 函數(shù),用于檢索數(shù)據(jù)并使用參數(shù) id 填充特定類(lèi)型的選擇下拉列表 (ddl):   function RetrieveDD(ddl, ddtype, id) {        var servicename;        switch (ddtype) {            case 'country':                servicename = "LoadCountries";                break;            case 'state':                servicename = "LoadStateProvinces";                break;            case 'city':                servicename = "LoadCityLocalities";                break;            default:                servicename = "";        }                error: function (err) {                    console.log('Error (RetrieveDD): ' + JSON.stringify(err, null, 2));                }            });        };    };我有一個(gè)執(zhí)行此操作的測(cè)試按鈕,并希望獲取所選選項(xiàng)的值(它將調(diào)用填充狀態(tài),獲取第一個(gè)選定狀態(tài)的值并再次調(diào)用以填充城市)。問(wèn)題很明顯:我不能說(shuō)在不知道前一個(gè)下拉列表的選定值的情況下填充下一個(gè)下拉列表(所以我必須有辦法等待下拉列表填充第一個(gè))。        $('#btnTest').click(function () {           RetrieveDD($("#ddlCountries"), "country", 0);            var cid = $("#ddlCountries").val();  //this is still undefined because ajax call above not completed             alert("cid = " + cid);    //normally another call would be made here to populate the states        });單擊該按鈕時(shí),您會(huì)立即看到一個(gè)警告框彈出窗口(沒(méi)有 cid 值),并且直到您單擊警告對(duì)話(huà)框中的 [確定] 按鈕后,國(guó)家下拉列表才會(huì)填充?;旧?,它的順序是錯(cuò)誤的。如果我將async:false添加到 ajax 例程中,您將看到顯示正確 cid 的警報(bào),但是,正如人們發(fā)布的那樣,您永遠(yuǎn)不應(yīng)使用async:false。我希望避免這種情況,但不確定如何正確執(zhí)行此操作。(如果有人想知道,我正在從舊的 dotnet webforms 網(wǎng)站中刪除所有 MSAjaxToolkit 廢話(huà),并用 jQuery ajax 替換——它更快、更小、更容易修復(fù)。)************** 回應(yīng)為什么我認(rèn)為這不是重復(fù)的 ********* 需要添加對(duì)舊 IE 支持的要求(Windows 7 附帶、8、8.1 和一些服務(wù)器版本)。IE 不支持箭頭函數(shù)或 promise(或 2015 年之后的大多數(shù) ECMA 方法),因此很多推薦的答案雖然很好,但沒(méi)有包含此類(lèi)代碼。我會(huì)嘗試解決這個(gè)問(wèn)題并在這里發(fā)布。
查看完整描述

3 回答

?
幕布斯7119047

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

類(lèi)似于 John M 的回答,但用法不同。


返回$.ajax承諾并使用.done()


if (servicename!="") 

    return $.ajax({...

// else return null


$('#btnTest').click(function () {

    var ajax = RetrieveDD($("#ddlCountries"), "country", 0);

    if (ajax) {  

        ajax.done(function(data) {  

            console.log('done');

        });

    }

});


查看完整回答
反對(duì) 回復(fù) 2022-01-01
?
Helenr

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊

JQuery.ajax() 實(shí)現(xiàn)了 Promise 接口,因此您可以獲取 ajax 調(diào)用返回的 Promise 對(duì)象并將其傳遞回您的調(diào)用函數(shù)。那可以在ajax調(diào)用完成后使用Promise.then()來(lái)調(diào)用代碼,我認(rèn)為這比使用回調(diào)更簡(jiǎn)潔。


   function RetrieveDD(ddl, ddtype, id) {

    var servicename;

    var promise;

    switch (ddtype) {

        case 'country':

            servicename = "LoadCountries";

            break;

        case 'state':

            servicename = "LoadStateProvinces";

            break;

        case 'city':

            servicename = "LoadCityLocalities";

            break;

        default:

            servicename = "";

    }

    if (servicename != "") {

         promise = $.ajax({

            url: 'DDService.asmx/' + servicename,

            dataType: 'json',

            method: 'post',

            data: { ID: id },

            success: function (data) {

                ddl.empty();

                $.each(data, function (index) {

                    ddl.append($("<option" + (index == 0 ? " selected" : "") + "></option>").val(this['V']).html(this['T']));

                    console.log('update list');

                });

            },

            error: function (err) {

                console.log('Error (RetrieveDD): ' + JSON.stringify(err, null, 2));

            }

        });

    };


    return promise;

};



$('#btnTest').click(function () {

    var promise = RetrieveDD($("#ddlCountries"), "country", 0);

    if (promise) {

        promise.then(function(value) {

            var cid = $("#ddlCountries").val();                  

            console.log('done');

        });

    }

});


查看完整回答
反對(duì) 回復(fù) 2022-01-01
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊

在您的函數(shù)中使用回調(diào):


function RetrieveDD(ddl, ddtype, id, callback = false) {

    // ...

    if (servicename != "") {

         $.ajax({

            url: 'DDService.asmx/' + servicename,

            dataType: 'json',

            method: 'post',

            data: { ID: id },

            success: function (data) {

                // ...

                if(typeof callback === 'function'){

                    callback(data);

                }

            },

            error: function (err) {

                // ...

                if(typeof callback === 'function'){

                    callback(err);

                }

            }

        });

    };

};


RetrieveDD($("#ddlCountries"), "country", 0, (data_or_error)=>{

    var cid = $("#ddlCountries").val();

});



查看完整回答
反對(duì) 回復(fù) 2022-01-01
  • 3 回答
  • 0 關(guān)注
  • 238 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)