为什么 'axios.get' 返回一个 promise 对象?
Why is 'axios.get' returning a promise object?
我一直在尝试使用 Axios 来检查用户是否已通过服务器端(Node+Express+Passport)的身份验证。
如果用户通过身份验证,服务器会发回一个 "Connected" 字符串,否则,它会发回一个 "Not connected" 字符串。
Router.get('/isAuth', function (req, res, next) {
if (req.isAuthenticated()) {
return res.status(200).send('Connected');
} else {
return res.status(200).send('Not connected');
}
});
我写了一个简单的函数来检查服务器的响应:
function isAuth() {
return axios.get('http://localhost:3000/endpoints/isAuth')
.then((response) => {
if (response.data === "Connected") {
return true;
} else {
return false;
}
})
.catch((error) => {
console.log(error)
})
}
如果用户已连接,该函数应该 return 为真,反之亦然。
现在,当我尝试在控制台中记录该函数的结果时,我得到的是:
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
__proto__ : Promise
[[PromiseStatus]] : "resolved"
[[PromiseValue]] : false
如您所见,值 returned 是一个 promise 对象,而所需的输出最好是 "True" 或 "False"。
isAuth 执行异步请求,这需要一些时间。因此它不能直接 return true 或 false。它将取而代之 return 一个获得该布尔值的承诺。要访问您的布尔值,您必须将 isAuth() 函数视为一个承诺:
isAuth().then(isAuthenticated => console.log(isAuthenticated));
更新:
此代码:
var test = isAuth();
将return同步承诺,不会等待响应结果
如果你想访问promise的响应,你需要使用then:
test.then(value => ...);
如果你真的想做一个同步的 http 请求(阻止你的应用程序,直到请求被解决)你可以查看 https://github.com/ForbesLindesay/sync-request
但如果不是仅用于测试目的,您实际上不想使用它。
您可以考虑的另一件事是使用节点 7.6 附带的 async/await,但您首先应该充分理解承诺的概念
我一直在尝试使用 Axios 来检查用户是否已通过服务器端(Node+Express+Passport)的身份验证。
如果用户通过身份验证,服务器会发回一个 "Connected" 字符串,否则,它会发回一个 "Not connected" 字符串。
Router.get('/isAuth', function (req, res, next) {
if (req.isAuthenticated()) {
return res.status(200).send('Connected');
} else {
return res.status(200).send('Not connected');
}
});
我写了一个简单的函数来检查服务器的响应:
function isAuth() {
return axios.get('http://localhost:3000/endpoints/isAuth')
.then((response) => {
if (response.data === "Connected") {
return true;
} else {
return false;
}
})
.catch((error) => {
console.log(error)
})
}
如果用户已连接,该函数应该 return 为真,反之亦然。
现在,当我尝试在控制台中记录该函数的结果时,我得到的是:
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
__proto__ : Promise
[[PromiseStatus]] : "resolved"
[[PromiseValue]] : false
如您所见,值 returned 是一个 promise 对象,而所需的输出最好是 "True" 或 "False"。
isAuth 执行异步请求,这需要一些时间。因此它不能直接 return true 或 false。它将取而代之 return 一个获得该布尔值的承诺。要访问您的布尔值,您必须将 isAuth() 函数视为一个承诺:
isAuth().then(isAuthenticated => console.log(isAuthenticated));
更新:
此代码:
var test = isAuth();
将return同步承诺,不会等待响应结果
如果你想访问promise的响应,你需要使用then:
test.then(value => ...);
如果你真的想做一个同步的 http 请求(阻止你的应用程序,直到请求被解决)你可以查看 https://github.com/ForbesLindesay/sync-request
但如果不是仅用于测试目的,您实际上不想使用它。
您可以考虑的另一件事是使用节点 7.6 附带的 async/await,但您首先应该充分理解承诺的概念