Javascript Node.js从匿名函数访问值

Javascript Node.js从匿名函数访问值,javascript,node.js,anonymous-function,scoping,Javascript,Node.js,Anonymous Function,Scoping,早上好 我一直在努力获取函数返回的特定值: const getFolders = function (PID){ var token = getStoredToken() request.get({ url: 'https://api.procore.com/vapid/folders', headers: { Authorization: "Bearer " + token.access_token }, json: { com

早上好

我一直在努力获取函数返回的特定值:

const getFolders = function (PID){
var token = getStoredToken()
request.get({
    url: 'https://api.procore.com/vapid/folders',
    headers: {
        Authorization: "Bearer " + token.access_token
    }, 
    json: {
        company_id: '12594',
        project_id: PID
    }
}, function test(err, response, body){
    return body
})
// I NEED THE RETURN VALUE OF THE ABOVE FUNCTION HERE SO I CAN ACCESS WHEN CALLING getFolders()
}
这可能吗?如果是,怎么做


谢谢

您所期望的方式是错误的,您传递给request.get方法的测试函数是一个回调函数,它将以非同步方式执行,这意味着无论何时您的API从服务器响应,该回调函数都将得到执行

因此在此之前,您期望的是请求方法下面的响应(主体),这是错误的

在这种情况下,您只需编写一些其他函数来调用这个get方法,在回调函数中,您可以轻松访问该响应,或者只需在测试函数本身中编写代码

如下图-:

request.get({
    url: 'https://api.procore.com/vapid/folders',
    headers: {
        Authorization: "Bearer " + token.access_token
    }, 
    json: {
        company_id: '12594',
        project_id: PID
    }
}, function test(err, response, body){
   // instead of returning body
   // use the body here only
   let result = body;

   // your code here
})
或者另一种方式-:

const getFolders = function (PID){
var token = getStoredToken();
this.get(function(err, response, body){
    // do whatever you want with the response now
      updateFolder()
})
}

function get(callback){
    request.get({
    url: 'https://api.procore.com/vapid/folders',
    headers: {
        Authorization: "Bearer " + token.access_token
    }, 
    json: {
        company_id: '12594',
        project_id: PID
    }
}, callback)
}

您所期望的方式是错误的,您传递给request.get方法的测试函数是一个回调函数,它将以异步方式执行,这意味着无论何时API从服务器响应,该回调函数都将得到执行

因此在此之前,您期望的是请求方法下面的响应(主体),这是错误的

在这种情况下,您只需编写一些其他函数来调用这个get方法,在回调函数中,您可以轻松访问该响应,或者只需在测试函数本身中编写代码

如下图-:

request.get({
    url: 'https://api.procore.com/vapid/folders',
    headers: {
        Authorization: "Bearer " + token.access_token
    }, 
    json: {
        company_id: '12594',
        project_id: PID
    }
}, function test(err, response, body){
   // instead of returning body
   // use the body here only
   let result = body;

   // your code here
})
或者另一种方式-:

const getFolders = function (PID){
var token = getStoredToken();
this.get(function(err, response, body){
    // do whatever you want with the response now
      updateFolder()
})
}

function get(callback){
    request.get({
    url: 'https://api.procore.com/vapid/folders',
    headers: {
        Authorization: "Bearer " + token.access_token
    }, 
    json: {
        company_id: '12594',
        project_id: PID
    }
}, callback)
}

通常有三种方法处理异步内容:

  • 回拨
  • 允诺
  • 异步/等待
回调:

const getFolders=函数(PID,回调){
var token=getStoredToken()
请求({
网址:'https://api.procore.com/vapid/folders',
标题:{
授权:“承载人”+令牌。访问令牌
},
json:{
公司id:'12594',
项目编号:PID
}
},功能(错误、响应、正文){
回调(正文)
})
}
getFolders(pid,(v)=>{
控制台日志(v)
})
承诺

const getFolders=函数(PID,回调){
返回新承诺((解决、拒绝)=>{
var token=getStoredToken()
请求({
网址:'https://api.procore.com/vapid/folders',
标题:{
授权:“承载人”+令牌。访问令牌
},
json:{
公司id:'12594',
项目编号:PID
}
},功能(错误、响应、正文){
如果(错误){
退货拒绝(err)
}
决议(正文)
})
})
}
getFolders(pid)
.然后(v=>{
控制台日志(v)
}).catch(错误=>{
控制台错误(错误)
})
异步/等待: 由于async/await实际上是一种语法糖,因此
getFolders
函数与使用promise的函数相同,不同之处在于调用它时:

(异步函数(){
试一试{
让v=等待getFolders(pid)
控制台日志(v)
}捕获(e){
控制台错误(e)
}
})()

不确定这是否能解决您的困惑。

通常有三种方法来处理异步内容:

  • 回拨
  • 允诺
  • 异步/等待
回调:

const getFolders=函数(PID,回调){
var token=getStoredToken()
请求({
网址:'https://api.procore.com/vapid/folders',
标题:{
授权:“承载人”+令牌。访问令牌
},
json:{
公司id:'12594',
项目编号:PID
}
},功能(错误、响应、正文){
回调(正文)
})
}
getFolders(pid,(v)=>{
控制台日志(v)
})
承诺

const getFolders=函数(PID,回调){
返回新承诺((解决、拒绝)=>{
var token=getStoredToken()
请求({
网址:'https://api.procore.com/vapid/folders',
标题:{
授权:“承载人”+令牌。访问令牌
},
json:{
公司id:'12594',
项目编号:PID
}
},功能(错误、响应、正文){
如果(错误){
退货拒绝(err)
}
决议(正文)
})
})
}
getFolders(pid)
.然后(v=>{
控制台日志(v)
}).catch(错误=>{
控制台错误(错误)
})
异步/等待: 由于async/await实际上是一种语法糖,因此
getFolders
函数与使用promise的函数相同,不同之处在于调用它时:

(异步函数(){
试一试{
让v=等待getFolders(pid)
控制台日志(v)
}捕获(e){
控制台错误(e)
}
})()

不确定这是否解决了您的困惑。

这是否回答了您的问题?返回。。。。为什么?只需对回调中的数据执行您需要执行的操作(例如,调用任何知道如何在那里使用它的函数)?另外,让getFolders调用getFolders听起来是个非常糟糕的主意。这能回答你的问题吗?返回。。。。为什么?只需对回调中的数据执行您需要执行的操作(例如,调用任何知道如何在那里使用它的函数)?另外,让getFolders调用getFolders听起来是个非常糟糕的主意。