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

时间:2014-12-22 02:42:13

标签: javascript callback closures

我有一些用LiveScript编写的代码(Coffeescript的fork),它将使用请求模块发出请求,然后将响应的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的回调函数?

1 个答案:

答案 0 :(得分:2)

不确定如何在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!");
});