Javascript 承诺不要等待谷歌OAuth
我遵循谷歌快速入门OAuth指南 我的功能不是返回一个承诺。它先运行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
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)}
})
})
})
}
//////////
/////////////