将回调函数用作香草JS ajax中的参数

问题描述 投票:0回答:2

我正在使用ajax函数从数据库中检索信息。我设置了API,而ajax函数确实检索了正确的值,但是我作为参数传递的回调函数在onreadystatechange上不起作用。

下面的简化代码

function serializeArgs(args) {
  //Serialize Arguments
}
function callback(a) {  //The function to be called as callback
  //Process the response and add contents to the page
}

function getListData(callback) {
  var ajaxOptions = {
    action: "get_data",
  }
  var request = new XMLHttpRequest();
  request.open("POST", apiurl, true);
  request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
  request.setRequestHeader("Accept-language", "en-US");
  request.onreadystatechange = function(event) {
    if (this.readyState == 4 && this.status == 200) {
      callback(this.response);
    }
  };
  request.send(serializeArgs(ajaxOptions));
}

当我运行函数时,出现错误“ TypeError:回调不是函数”

我整天都在苦苦挣扎,但是由于我对ajax经验不足,所以我不知道为什么会发生这种情况以及如何解决。我有一种预感,它与ajax的异步性质有关,但是我不确定如何解决此问题。

javascript ajax
2个回答
0
投票

您在哪里调用函数getListData

我的猜测是,您像getListData()一样调用它而没有传递回调函数。如果您像getListData(callback)这样称呼它,它应该可以工作。没有完整的代码示例,很难说会发生什么。

仅用于测试,您也可以更改行

function getListData(callback) {

function getListData() {

只是看它是否有效。

[在第二个版本中,您不传递回调,因此,当您调用callback函数时,JavaScript会在父作用域中查找它。


0
投票

此错误的简短参考:

通常在发生以下情况时出现此错误:

  • [仅在该属性的属性上进行函数调用时不是函数。
  • 当对不包含该函数或方法的对象类型进行函数调用时。
  • [在希望提供回调函数参数的内置方法上进行函数调用,但不存在此类函数时。

我在您的ajax函数中注意到以下内容:

您的参数名为callback,就像您的函数callback一样。您的ajax函数要执行的操作是将参数callback用作函数(不确定是否将函数callback作为参数传递,如果可以,那么就可以了,但是由于我看不到您的位置)调用getListData函数,我只能猜测您正在调用它而没有将函数callback作为参数传递。

//Your function callback is trying to access this parameter.
//So unless your actual function callback is being passed in as an argument,
//it's most likely trying to access your parameter even though it is NOT a function or it isn't even receiving a function as parameter
function getListData(callback)
function callback(a)

这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.