【问题标题】:How to pass callback as variable to predefined callback如何将回调作为变量传递给预定义的回调
【发布时间】:2014-12-22 02:42:12
【问题描述】:

我有一些用 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 绑定到 makeRequest 的范围,但是尽管我尽了最大的努力和争论,但我今天也无法做到这一点。

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

【问题讨论】:

    标签: javascript callback closures


    【解决方案1】:

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

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

    所以基本上你传递给request 的回调调用requestCallback 并带有另一个参数。

    如果您正在做很多异步工作,那么值得研究一下Promises。他们真的可以帮助避免回调意大利面。

    使用 Promises,您可以执行以下操作:

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

    【讨论】:

    • 酷,谢谢,我想我会暂时使用这个。今天我想看看所谓的干净回调可以带我走多远,但将来我肯定会研究 Promise 和 generator。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    相关资源
    最近更新 更多