javascript - 如何将回调作为变量传递给预定义的回调

标签 javascript callback closures

我用 LiveScript(Coffeescript 的分支)编写了一些代码,这些代码将使用请求模块发出请求,然后将响应的 statusCode 传递给回调。

url = 'http://www.google.ca'

logCode = (statusCode) ->
  console.log statusCode

makeRequest = (url, callback) ->
  request url, (err, response, body) ->
    if body
      callback response.statusCode
    else
      console.log "No response"

makeRequest url, logCode

这按预期工作,回调成功触发,并将“200”记录到控制台。

但是,我想让我的代码尽可能干净,并删除任何嵌套的回调。因此,我定义了一个函数作为我的请求回调,并将其作为请求的第二个参数传递。

url = 'http://www.google.ca'

requestCallback = (err, response, body) ->
  if body
    callback response.statusCode
  else
    console.log "No response"

logCode = (statusCode) ->
  console.log statusCode

makeRequest = (url, callback) ->
  request url, requestCallback

makeRequest url, logCode

但是,运行它当然会返回一个错误,指出回调未定义。这当然是完全有道理的,因为在requestCallback操作的范围内,不存在名为callback的函数,并且它无法访问makeRequest中定义的回调。

根据我所读到的内容,我可以在匿名函数中声明 requestCallback,这将允许将回调传递给它。我已经尝试了我能想到的所有方式,但没有结果。

此外,似乎可以选择将 requestCallback 绑定(bind)到 makeRequest 的范围,但是尽管我尽了最大的努力和争论,但今天我也无法做到这一点。

如何让 requestCallback 知道传递给 makeRequest 的回调函数?

最佳答案

不确定如何在 LiveScript 中编写它,但在 JavaScript 中:

function makeRequest(url, callback) {
    request(url, function (err, response, body) {
        requestCallback(err, response, body, callback);
    });
}

所以基本上,您传递给 request 的回调会使用另一个参数调用 requestCallback

如果您正在执行大量异步操作,那么值得研究一下Promises。它们确实可以帮助避免回调意大利面条。

使用 Promise 你可以做类似的事情:

makeRequest(url).done(function (response, body) {
    if (body) {
        logCode(response.statusCode)
    } else {
        console.log("No response");
    }
}).fail(function (response) {
    throw new Error("uhoh!");
});

关于javascript - 如何将回调作为变量传递给预定义的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595957/

相关文章:

ruby-on-rails - Ruby method_added 回调不触发包括模块

c# - 这种将异步方法转换为同步方法的方法是否正确?

javascript - 从回调函数中获取变量

javascript - 复制到剪贴板 Javascript

javascript - AJAX 未将数据传递给 PHP 脚本?

javascript - shopify 如何创建产品色样

javascript - Javascript 文件之间无法访问窗口变量

javascript - 根据要循环的元素数增加 Bootstrap 进度条百分比

java - 实体监听器调用顺序

ios - 在 Web View 中点击应用程序 url 方案后如何返回应用程序