Javascript 将回调传递给匿名函数

Javascript 将回调传递给匿名函数,javascript,ajax,Javascript,Ajax,我一整天都在和你打交道。“sendResponse”是一个回调函数。因为我处理的是ajax请求,所以我必须在请求后使用它来检索数据。我只是无法将它传递到处理ajax响应的匿名函数中。这里的解决方案是什么 runningTimeEntry: function (sendResponse) { TogglButton.ajax('/time_entries/current', { method: 'GET', onLoad: function (x

我一整天都在和你打交道。“sendResponse”是一个回调函数。因为我处理的是ajax请求,所以我必须在请求后使用它来检索数据。我只是无法将它传递到处理ajax响应的匿名函数中。这里的解决方案是什么

runningTimeEntry: function (sendResponse) {
      TogglButton.ajax('/time_entries/current', {
          method: 'GET',
          onLoad: function (xhr) {
              var responseData = JSON.parse(xhr.responseText);
              sendResponse(responseData.data); // this line doesn't work
          }
      });
  },

  ajax: function (url, opts) {
      var xhr = new XMLHttpRequest(),
          method = opts.method || 'GET',
          baseUrl = opts.baseUrl || TogglButton.$newApiUrl;
      xhr.open(method, baseUrl + url, true);
      if (opts.onLoad) {
          xhr.addEventListener('load', function () {
              opts.onLoad(xhr);
          });
      }
      if (TogglButton.$user) {
          xhr.setRequestHeader('Authorization', 'Basic ' + btoa(TogglButton.$user.api_token + ':api_token'));
      }
      xhr.send(JSON.stringify(opts.payload));
  },
简而言之,这将返回{test:“test”}:

但这并不是:

runningTimeEntry: function (sendResponse) {
  TogglButton.ajax('/time_entries/current', {
      method: 'GET',
      onLoad: function (xhr) {
          sendResponse({
              test: 'test'
          }); // this line doesn't work
      }
  });
},

你能把你的代码适当地缩进吗?把它放进你的问题里,你错了
sendResponse
保留在范围内,这就是闭包的用途。如果您在那里遇到异常,那么错误一定在其他地方。您遇到的错误是什么?请具体说明出现了什么问题。在第一种情况下,您将立即调用
sendResponse
,而不是将其分配给
onLoad
。至于第二种情况,可能还有其他一些不在javascript中的错误。这是我第一次修改chrome扩展。第一个问题是,background.js脚本没有向页面控制台报告错误,而是向特殊屏幕报告错误。第二个问题是,根本没有错误。经过广泛的挖掘,答案是:javascript中的异步。谢谢你的帮助。
runningTimeEntry: function (sendResponse) {
  TogglButton.ajax('/time_entries/current', {
      method: 'GET',
      onLoad: function (xhr) {
          sendResponse({
              test: 'test'
          }); // this line doesn't work
      }
  });
},