我有一些用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的回调函数?
不知道如何在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!");
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句