Node.js Доступ к значениям из анонимной функции - PullRequest
0 голосов
/ 21 января 2020

Доброе утро!

Я изо всех сил пытался получить конкретное c значение, возвращаемое из моей функции:

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()
}

Возможно ли это? Если да, то как?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Обычно существует три способа работы с асинхронными вещами:

  • обратный вызов
  • обещание
  • асинхронное / ожидание

обратный вызов:

const getFolders = function(PID, callback) {
  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(err, response, body) {
    callback(body)
  })
}

getFolders(pid, (v) => {
  console.log(v)
})

обещание :

const getFolders = function(PID, callback) {
  return new Promise((resolve, reject) => {
    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(err, response, body) {
      if (err) {
        return reject(err)
      }
      resolve(body)
    })
  })
}

getFolders(pid)
  .then(v => {
    console.log(v)
  }).catch(error => {
    console.error(error)
  })

async / await : из-за асинхронного / ожидание фактически Синтаксический сахар, функция getFolders такая же, как и в обещании, разница в том, когда вы ее вызываете:

(async function() {
  try {
    let v = await getFolders(pid)
    console.log(v)
  } catch(e) {
    console.error(e)
  }
})()

Не уверен, решит ли это вашу путаницу.

0 голосов
/ 21 января 2020

То, что вы ожидаете, неверно, тестовая функция, которую вы передали методу 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)
}
...