Javascript 承诺不要等待谷歌OAuth

Javascript 承诺不要等待谷歌OAuth,javascript,api,promise,oauth-2.0,google-api,Javascript,Api,Promise,Oauth 2.0,Google Api,我遵循谷歌快速入门OAuth指南 我的功能不是返回一个承诺。它先运行Oauth请求,然后再运行回调,但它不会返回一个可执行的承诺 它运行请求并成功进行身份验证,只有调用它的主函数才会在请求完成之前解析,并给出未定义的、连续的垃圾邮件请求,因为它认为前一个请求已完成 我似乎无法让函数等待请求完成解析。我做错了什么 const getAuth = (_callback) => fs.readFile('client_secret.json', function processClientSe

我遵循谷歌快速入门OAuth指南

我的功能不是返回一个承诺。它先运行Oauth请求,然后再运行回调,但它不会返回一个可执行的承诺

它运行请求并成功进行身份验证,只有调用它的主函数才会在请求完成之前解析,并给出未定义的、连续的垃圾邮件请求,因为它认为前一个请求已完成

我似乎无法让函数等待请求完成解析。我做错了什么

const getAuth = (_callback) => fs.readFile('client_secret.json', function processClientSecrets(err, content) {
  console.log("Getting Auth")
  if (err) {
    console.log('Error loading client secret file: '.red + err);
    return;
  }
  console.log("Authorizing the client".green)
  // Authorize a client with the loaded credentials, then call the YouTube API.
  authorize(JSON.parse(content), _callback);
});

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 *
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
  var clientSecret = credentials.installed.client_secret;
  var clientId = credentials.installed.client_id;
  var redirectUrl = credentials.installed.redirect_uris[0];
  var oauth2Client = new OAuth2(clientId, clientSecret, redirectUrl);

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, function (err, token) {
    if (err) {
      getNewToken(oauth2Client, callback);
    } else {
      oauth2Client.credentials = JSON.parse(token);
      callback(oauth2Client);
    }
  });
}
使用此搜索功能:

const search = function (args, _cb) {
    console.log("|| Youtube Search ||".yellow)
    console.log("Asking Google For Auth...".red)
    let results = {} // Search Results
    google.getAuth((auth) => { // OAuth2
        google.searchYoutube(auth, args)
        .then((results)=>{
            console.log(results)
            return results
        })
    })
}

/**
 * Search YouTube with query params. Returns a list of youtube objects.
 *
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
const searchYoutube = function (auth, args) {

  var service = google.youtube('v3');
  csv = args.toString()
  console.log("Submitting Query to youtube: ".magenta, csv.green)
  return service.search.list({
      auth: auth,
      "part": [
        "snippet"
      ],
      "maxResults": 25,
      "q": csv
    })
    .catch(err => console.log)
}

并像这样调用搜索:

    async function SearchYoutube(){
        console.log("Asking Youtube for Search")
        const results = Youtube.search('Spongebob')
        console.log("After search")

        console.log("Got Results: ",results)
    }
控制台输出:

Asking Youtube for Search
|| Youtube Search ||
Asking Google For Auth...
After search
Got Results:  undefined
Getting Auth
Authorizing the client
Submitting Query to youtube:  Spongebob
{
  <RESPONSE SUCCESS> ...

您的
const search=function
使用从未使用过的
\u cb
。。。函数不会返回任何内容。。。因此,
中的结果。然后((结果)=>{
只记录到控制台,但在
之外无法访问。然后
您还创建了
异步函数搜索YouTube
…为什么
异步
,因为您从未等待过
不需要使用,我从以前的测试中保留了它。我只是删除了它,但它仍然不起作用。问题是getAuth方法不是异步的。我尝试等待它,但IDE说这无关紧要。我使用的方法来自google quickstart文档,我只是不知道如何修改它以使其成为承诺,ins不使用回调。实际上它是异步的-并且您正在使用异步结果的回调-您正在做它,但是在
search
中您正在执行
google.searchYoutube(auth,args)
并且什么也不做(除了console.log)有了这些结果——正如我在第一篇评论中所说,你的
const search=function
使用了从未使用过的
\u cb
,并且该函数不返回任何内容……因此,结果将显示在
中。然后((results)=>{
只记录到控制台,但在控制台之外无法访问。然后
您还创建了
异步函数搜索YouTube
…为什么
异步
,因为您从不等待不需要使用,我从以前的测试中保留了它。我只是删除了它,但它仍然不起作用。问题是getAuth方法不是异步的。我尝试等待它,但IDE说这无关紧要。我使用的方法来自google quickstart文档,我只是不知道如何修改它以使其成为承诺,ins而不是使用回调。实际上,它是异步的-并且你正在使用异步结果的回调-你正在做这件事,但是在
search
中,你正在执行
google.searchYoutube(auth,args)
并且对这些结果不做任何事情(除了console.log),正如我在第一条评论中所说的
//////////
////////////
/// Promisified OAuth
let AuthenticatedSearch = function (args) {
  console.log("Making an authenticated request to youtube... args: ", args)
  return new Promise((resolve, reject) => {
    getAuth((auth) => {
      searchYoutube(auth, args)
      .then((response,err)=>{
        if(err) reject(err)
        else {
          console.log("Response: ",response)
          resolve(response)}

      })
    })
  })

}

//////////
/////////////