Jquery 带有ajax调用的递归函数

Jquery 带有ajax调用的递归函数,jquery,ajax,recursion,Jquery,Ajax,Recursion,我的REST API有三列“ser\u noofsubcomponents、ContactId、ParentCustomerId” 如果seru noofsubcomponents>0,则表示他们有子联系人,那么我们需要递归调用此函数,seru noofsubcomponents的编号最多为10 请在jquery中推荐任何好的解决方案 function getContituent(id, parentcustomerid) { var query = "";

我的REST API有三列
“ser\u noofsubcomponents、ContactId、ParentCustomerId”

如果seru noofsubcomponents>0,则表示他们有子联系人,那么我们需要递归调用此函数,seru noofsubcomponents的编号最多为10

请在jquery中推荐任何好的解决方案

        function getContituent(id, parentcustomerid) {
        var query = "";
        if (parentcustomerid)
            query = _ODataPath() + "ContactSet?$select=ser_noofsubconstituents,FullName,ContactId,ParentCustomerId&$filter=ParentCustomerId/Id eq guid'" + id + "'";
        else
            query = _ODataPath() + "ContactSet" + "(guid'" + id + "')?$select=ser_noofsubconstituents,FullName,ContactId,ParentCustomerId";

        return $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: query,
            beforeSend: function (xhr) {
                xhr.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, xhr) {
                if (!parentcustomerid) {
                    var cont = {};
                    window._noofsubconstituents = data.d.ser_noofsubconstituents;
                    cont.ser_noofsubconstituents = data.d.ser_noofsubconstituents;
                    cont.contactId = data.d.ContactId;
                    cont.FullName = data.d.FullName;
                    cont.ParentCustomerId = data.d.ParentCustomerId;
                    items.push(cont);
                    window.fetchCompleted = true;
                    $("#contactListView").append("<li style='padding-left:4px;' onclick='contituent_click(this)' data-id='" + cont.contactId + "'><h2>" + cont.FullName + "<h2><div></div></li>");
                } else {
                    for (var i = 0, len = data.d.results.length; i < len; ++i) {
                        var cont = {};
                        window._noofsubconstituents = data.d.results[i].ser_noofsubconstituents;
                        cont.ser_noofsubconstituents = data.d.results[i].ser_noofsubconstituents;
                        cont.contactId = data.d.results[i].ContactId;
                        cont.FullName = data.d.results[i].FullName;
                        cont.ParentCustomerId = data.d.results[i].ParentCustomerId;
                        items.push(cont);

                        var pl = $("#contactListView").find("li[data-id=" + cont.ParentCustomerId.Id + "]").attr("style");

                        if (pl != undefined) {
                            pl = parseInt($.trim(pl.split(":")[1].replace("px", ""))) + 4;
                        } else {
                            pl = 4;
                        }

                        $("#contactListView").append("<li style='padding-left:" + pl + "px;' onclick='contituent_click(this)'  data-id='" + cont.contactId + "'><h2>" + cont.FullName + "<h2><div></div></li>");
                    }

                    if (data.d.results.length > 0) {
                        window.fetchCompleted = false;
                        getContituent(data.d.results[0].ContactId, true);
                    }
                }
                if (window._noofsubconstituents > 0) {
                    window.fetchCompleted = false;
                    getContituent(data.d.ContactId, true);
                }
            },
            error: function (xhr, textStatus, errorThrown) { }
        });
    }
函数GetContinuent(id,parentcustomerid){
var query=“”;
if(parentcustomerid)
query=\u ODataPath()+“ContactSet?$select=ser\u noofsubcomponents,FullName,ContactId,ParentCustomerId&$filter=ParentCustomerId/Id eq guid'+Id+”;
其他的
query=\u ODataPath()+“ContactSet”+“(guid'”+id+“)?$select=ser\u noofsubcomponents,FullName,ContactId,ParentCustomerId”;
返回$.ajax({
键入:“获取”,
contentType:“应用程序/json;字符集=utf-8”,
数据类型:“json”,
url:query,
发送前:函数(xhr){
setRequestHeader(“接受”、“应用程序/json”);
},
成功:函数(数据、文本状态、xhr){
如果(!parentcustomerid){
var cont={};
窗口。_noofsubcomponents=data.d.ser_noofsubcomponents;
cont.ser_noofsubcomponents=data.d.ser_noofsubcomponents;
cont.contactId=data.d.contactId;
cont.FullName=data.d.FullName;
cont.ParentCustomerId=data.d.ParentCustomerId;
项目。推送(续);
window.fetchCompleted=true;
$(“#contactListView”).append(
  • “+cont.FullName+”
  • ”; } 如果(data.d.results.length>0){ window.fetchCompleted=false; GetContinuent(data.d.results[0].ContactId,true); } } 如果(窗口。\u noofsubcomponents>0){ window.fetchCompleted=false; GetContinuent(data.d.ContactId,true); } }, 错误:函数(xhr、textStatus、errorshown){} }); }
    在此上下文中执行递归有点不同,因为调用是异步的。您要做的是提供回调并从中返回,而不是从函数本身返回

    例如:

    function getStuff(inputArray, done, results, index) {
        if (!results) results = [];
        if (index === inputArray.length) return done(results);
        $.ajax({
            url: 'example.com/json',
            success: function(data) {
                results.push(data);
                getStuff(inputArray, done, results, ++index);
            }
        });
    }