Javascript 如何在Nodejs中从内部函数返回值
我有使用请求库从url获取身份验证令牌的Nodejs代码Javascript 如何在Nodejs中从内部函数返回值,javascript,node.js,Javascript,Node.js,我有使用请求库从url获取身份验证令牌的Nodejs代码 var request = require("request") const wellish_dev_url = "https://dev.wellish.com" function get_auth_token(){ const api_end_point = wellish_dev_url + "/api/v1/auth" var options = { url: api_end_point,
var request = require("request")
const wellish_dev_url = "https://dev.wellish.com"
function get_auth_token(){
const api_end_point = wellish_dev_url + "/api/v1/auth"
var options = {
url: api_end_point,
headers: {"Content-Type": "application/json"},
auth: {
'user': 'admin',
'pass': 'password'}
}
var r = request.get(options, function(error, response, body){
if(!error && response.statusCode==200){
var token = JSON.parse(body)
var auth_token = token["data"][0]["accessToken"]
// console.log(auth_token)
return auth_token
}
else{
console.log("Code : " + response.statusCode)
console.log("error : " + error)
console.log('body : ' + body)
}
})
}
// get_auth_token()
var auth_token_new = get_auth_token()
console.log(auth_token_new)
我想返回auth_标记
,作为另一个函数中的参数使用。但是,它显示未定义
我在网上查到使用
cb
,但是,我不知道它是如何工作的。我确实希望返回值,而不使用cb
。有什么帮助吗?只有在服务器返回响应后才会执行回调。到那时,您的函数将已经执行
因为您的代码是异步的,所以您需要一种只在从服务器返回响应时才返回响应的方法
您可以使用用于该任务的
下面是一个关于如何在您的特定情况下解决此问题的示例。使用承诺构造函数返回一个承诺,该承诺在调用内部回调时解析/拒绝
然后,您只需将.Then()
链接到函数调用即可获得令牌:
...
function get_auth_token() {
const api_end_point = ...
const options = ...
return new Promise((resolve, reject) => {
var r = request.get(options, (error, response, body) => {
if (!error && response.statusCode == 200){
var token = JSON.parse(body)
var auth_token = token["data"][0]["accessToken"]
resolve(auth_token)
} else {
console.log("Code : " + response.statusCode)
console.log("error : " + error)
console.log('body : ' + body)
reject(error)
}
})
});
}
get_auth_token()
.then(token => console.log(token))
.catch(error => console.error(error));
您也可以使用await
这样从承诺中获取值,只需确保在标记为async
的函数中使用await
:
async function parent_function() {
function get_auth_token() { ... }
try {
const token = await get_auth_token();
console.log(token);
} catch (error) {
console.log(error);
}
}
只有从服务器返回响应后,才会执行回调。到那时,您的函数将已经执行 因为您的代码是异步的,所以您需要一种只在从服务器返回响应时才返回响应的方法 您可以使用用于该任务的 下面是一个关于如何在您的特定情况下解决此问题的示例。使用承诺构造函数返回一个承诺,该承诺在调用内部回调时解析/拒绝 然后,您只需将
.Then()
链接到函数调用即可获得令牌:
...
function get_auth_token() {
const api_end_point = ...
const options = ...
return new Promise((resolve, reject) => {
var r = request.get(options, (error, response, body) => {
if (!error && response.statusCode == 200){
var token = JSON.parse(body)
var auth_token = token["data"][0]["accessToken"]
resolve(auth_token)
} else {
console.log("Code : " + response.statusCode)
console.log("error : " + error)
console.log('body : ' + body)
reject(error)
}
})
});
}
get_auth_token()
.then(token => console.log(token))
.catch(error => console.error(error));
您也可以使用await
这样从承诺中获取值,只需确保在标记为async
的函数中使用await
:
async function parent_function() {
function get_auth_token() { ... }
try {
const token = await get_auth_token();
console.log(token);
} catch (error) {
console.log(error);
}
}
cb
简单的意思是回调
-它的工作原理与任何其他回调都类似。我可以在不使用cb的情况下执行它吗?我建议从函数返回一个承诺,并在内部回调中解决它,如果可以的话,我可以用一个例子来提供答案help@jo_va或者您可以参考建议的副本,因为它几乎涵盖了JavaScript中异步代码的所有可能主题。cb
只是指callback
——它的工作原理与任何其他回调的工作原理类似。我可以不使用cb?我建议从函数中返回一个承诺,并在内部回调中解决它,如果可以的话,我可以用一个例子给出答案help@jo_va或者您可以参考建议的副本,因为它几乎涵盖了JavaScript中异步代码的所有可能主题,我不知道我们必须使用Promise和callback,我只想像python那样返回值。有没有办法不使用承诺和承诺就返回callback@Akira,当服务器返回响应时,您的回调将在稍后执行。因此,代码本质上是异步的。您的函数将在服务器响应到来之前执行完毕,因此您需要一种只在响应返回后执行代码的方法,您可以使用一个承诺。同时使用resolve
和reject
时,最好提供一行代码来负责处理第二个响应,例如:get\u-auth\u-token().then(console.log).catch(console.log)
或get\u-auth\u-token().then(result=>{console.log(result)}.catch(error=>{console.log(error)})
在这种情况下,这两个结果是相同的。为了避免混淆,请坚持第二个示例(第一个示例用于OP的进一步研究;)。@Akira,看一看-答案描述了如何使用@jo提供的示例分配promise
/async/await
的结果_va@Akira,我建议你读一些关于承诺的材料。这已经用解释过了。然后
和异步/等待
,看看我的更新答案。我对Nodejs非常陌生,我不知道我们必须使用承诺和回调,我只想像python那样简单地返回值。有没有办法不使用承诺和承诺就返回callback@Akira,当服务器返回响应时,您的回调将在稍后执行。因此,代码本质上是异步的。您的函数将在服务器响应到来之前执行完毕,因此您需要一种只在响应返回后执行代码的方法,您可以使用一个承诺。同时使用resolve
和reject
时,最好提供一行代码来负责处理第二个响应,例如:get\u-auth\u-token().then(console.log).catch(console.log)
或get\u-auth\u-token().then(result=>{console.log(result)}.catch(error=>{console.log(error)})
在这种情况下,这两个结果是相同的。为了避免混淆,请坚持第二个示例(第一个示例用于OP的进一步研究;)。@Akira,看一看-答案描述了如何使用@jo提供的示例分配promise
/async/await
的结果_va@Akira,我建议你读一些关于承诺的材料。这已经用解释过了。然后
和异步/等待
,请参阅我的更新答案。