Usually there will be three ways dealing with asynchronous stuff: 
- callback
- promise
- async/await
callback:
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)
})
promise:
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:
Due to async/await is actually a syntax sugar, the getFolders function is the same as using promise's, the difference is when you call it:
(async function() {
  try {
    let v = await getFolders(pid)
    console.log(v)
  } catch(e) {
    console.error(e)
  }
})()
Not sure if this solve your confusion.