我正在尝试根据其状态代码验证某些网址。我试着做这样的事情:
const http = require('http');
let link = 'http://source.unsplash.com/random/100x100';
const getStatusCode = (link, callback) => {
http.get(link, res => {
callback(res.statusCode);
})
}
const codeCallback = code => {
console.log('Status code inside callback: ', code); //works, displays 301
return code
}
let statusCode = getStatusCode(link, codeCallback)
console.log(statusCode) //undefined
if (statusCode) {...} //do something
有没有办法存储状态代码,还是应该在回调中实现验证逻辑?
答案 0 :(得分:1)
欢迎回调地狱;)
您使用它的方式 - 是的,您需要在回调中执行验证逻辑。
如果您决定进一步探索这个领域,我建议您在JavaScript中查找promises和async / await。
祝你好运!答案 1 :(得分:0)
您的代码是在javascript中发生异步调用时出现的典型问题的一个很好的示例。具体来说,问题是您尝试在其值可用之前打印变量。
为了解释更多,所有的http请求本质上都是异步的,因为它们在您等待服务器响应时不应该阻止您的应用程序。
因此,当您调用console.log(statusCode)时,此行将在执行http.get回调之前执行,因此在执行时,statusCode未定义。
实际上,解决方案是处理回调中的statusCode。这样的事情。
const http = require('http');
let link = 'http://source.unsplash.com/random/100x100';
const getStatusCode = (link, callback) => {
http.get(link, res => {
if (res.statusCode){
callback(res.statusCode);
}
})
}
const codeCallback = code => {
console.log('Status code inside callback: ', code); //works, displays 301
return code
}
getStatusCode(link, codeCallback);
如果您有兴趣了解整个异步逻辑执行是如何工作的,那么这是一个很好的介绍https://www.youtube.com/watch?v=8aGhZQkoFbQ