我用 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/