Javascript AJAX函数未从其调用的函数接收返回数据

Javascript AJAX函数未从其调用的函数接收返回数据,javascript,ajax,django,Javascript,Ajax,Django,这有点难以解释,因为我不确定发生了什么。 在这个Django web项目的代码库中,我有一个自定义列表类,它管理几个LI元素。该类有一个“find”方法,该方法返回匹配字符串的DOM元素 接下来,我有一个AJAX查询,它进行服务器端python调用以处理数据并调用我的响应函数。我的python脚本对列表中的每一项都进行了分析,因此它会进行后续的AJAX调用。我的AJAX的响应函数从我的列表对象调用“find”方法,传递AJAX从python脚本接收的文本数据 “find”方法正在成功执行并返回正

这有点难以解释,因为我不确定发生了什么。 在这个Django web项目的代码库中,我有一个自定义列表类,它管理几个LI元素。该类有一个“find”方法,该方法返回匹配字符串的DOM元素

接下来,我有一个AJAX查询,它进行服务器端python调用以处理数据并调用我的响应函数。我的python脚本对列表中的每一项都进行了分析,因此它会进行后续的AJAX调用。我的AJAX的响应函数从我的列表对象调用“find”方法,传递AJAX从python脚本接收的文本数据

“find”方法正在成功执行并返回正确的结果(或者“尝试”返回结果)。它在第一个项目上成功返回了一些内容,但之后的每个项目都是“未定义的”。“find”方法中的控制台日志在返回返回对象之前为我提供了正确的返回对象,但调用“find”后的日志立即为我提供了“未定义”的内容

这是AJAX反复调用的范围问题吗

/* This is a large class, so I've omitted irrelevant members to the question. */
class UnorderedList{
   constructor(){
      this.__element = document.createElement("UL");
      this.__listItems = [];
   }

   /* Creates a LI element for this list with the given string. */
   addItem(str){...}

   /* Returns the inner text of a LI element. */
   getTextFromIndex(n){...}

   /* Returns the LI element for the matching string. */
   find(str){
      function __find(str, listItems, n=0){
         if(n >= listItems.length){
            /* B: */ console.log("no results found for '"+str+"'");
            return false;
         }
         if(str == listItems[n].innerText){
            /* C: */ console.log("search successful");
            var objLi = listItems[n];
            /* D: */ console.log(objLi);        // Gives the correct object everytime.
            return objLi;
         }
         __find(str, listItems, ++n);
      }

      /* A: */ console.log("searching for '"+str+"'");
      return __find(str, this.__listItems);
  }
}


class Analyser{

  constructor(){
     /* Assume this list already contains data. */
     this.__entityList = new UnorderedList();
  }

  analyse(n=0){
     if(n >= this.__entityList.filterLength) return;

     $.ajax({
        type: "POST",
        url: url,
        data: {
           csrfmiddlewaretoken: csrfToken,
           textData: this.__entityList.getTextFromIndex(n),
           nResults: MAX_RESULTS,
           nIteration: n,
        },
        success: this.response.bind(this)
     });
  }

  response(response){

     var results = JSON.parse(response);

     var objLi = this.__entityList.find(results.textData)
     /* E: */ console.log(objLi);    // Every item after the first is undefined.

     this.analyse(Number(results.nIteration) + 1);
  }
}
使用大括号表示HTML标记

控制台日志:

A: searching for "some text string"

C: search successful

D: {li style=""}

E: {li style=""}

A: searching for "some text string"

C: search successful

D: {li style=""}

E: undefined

A: searching for "some text string"

C: search successful

D: {li style=""}

E: undefined

您错过了对
\u find
函数的递归调用中的return语句

function __find(str, listItems, n=0){
     // rest of your code

     // you missed the return statement
     return __find(str, listItems, ++n);
}

不确定,但我会将该
csrfmiddlewaretoken
视为可能的罪魁祸首。它似乎在第一次请求时就被使用了,服务器端不再像预期的那样响应了。facepalm谢谢!