处理 Google API 响应
Handle Google API Response
我想从 YouTube 视频中获取评论并进一步处理它们。我从“CommentThreads: list”文档中的实施示例开始,并从那里继续。
使用主函数我想调用 execute
函数并使用它应该 return 的响应。它看起来应该类似于以下内容:
function execute() {
return gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
}).then(function(response) {
console.log(response.result);
},
function(err) {
console.error("Execute error", err);
});
}
function main(){
let response = execute();
console.log(response);
}
控制台中的输出如下所示:
{
"Ca": 2,
"yb": null,
"Yj": null,
"Sn": null,
"KB": false,
"xw": false
}
我尝试解决此问题的另一种方法不是 return gapi.client.youtube.commentThreads.list
,而是成功承诺函数中的响应,如下所示:
function execute() {
gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
}).then(function(response) {
console.log(response.result);
return reponse.result;
},
function(err) {
console.error("Execute error", err);
});
}
但是这里我只得到一个undefined
。
我正在学习JavaScript和API的使用。
编辑:
我还应该补充一点,执行函数中的 console.log(response.result);
确实打印了我想要的信息。但是一旦我 return 它并想在 main()
函数中使用它,它就会改变。
问题似乎在于,在使用 gapi 时,它 return 是我想要 return 的承诺。 Promised 不会立即评估,这意味着它会继续执行以下功能,returning 一个尚未响应的值。
我通过使用 async/await 功能来处理 promises 来解决这个问题,这在我看来似乎更容易理解和优雅。我还将一些变量更改为常量,因为它们不需要 non-constants。我的结果如下所示:
await function execute() {
let response = await gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
});
return response.result;
}
async function main(){
let response = await execute();
console.log(response);
}
我们还必须在 main()
函数中使用 async 和 await 的原因是,根据定义,异步函数总是 return promises。
要了解有关 async/await 的更多信息,我找到了这篇我喜欢其解释的文章:https://javascript.info/async-await
他们还有一篇关于承诺的文章:https://javascript.info/promise-basics
我想从 YouTube 视频中获取评论并进一步处理它们。我从“CommentThreads: list”文档中的实施示例开始,并从那里继续。
使用主函数我想调用 execute
函数并使用它应该 return 的响应。它看起来应该类似于以下内容:
function execute() {
return gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
}).then(function(response) {
console.log(response.result);
},
function(err) {
console.error("Execute error", err);
});
}
function main(){
let response = execute();
console.log(response);
}
控制台中的输出如下所示:
{
"Ca": 2,
"yb": null,
"Yj": null,
"Sn": null,
"KB": false,
"xw": false
}
我尝试解决此问题的另一种方法不是 return gapi.client.youtube.commentThreads.list
,而是成功承诺函数中的响应,如下所示:
function execute() {
gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
}).then(function(response) {
console.log(response.result);
return reponse.result;
},
function(err) {
console.error("Execute error", err);
});
}
但是这里我只得到一个undefined
。
我正在学习JavaScript和API的使用。
编辑:
我还应该补充一点,执行函数中的 console.log(response.result);
确实打印了我想要的信息。但是一旦我 return 它并想在 main()
函数中使用它,它就会改变。
问题似乎在于,在使用 gapi 时,它 return 是我想要 return 的承诺。 Promised 不会立即评估,这意味着它会继续执行以下功能,returning 一个尚未响应的值。
我通过使用 async/await 功能来处理 promises 来解决这个问题,这在我看来似乎更容易理解和优雅。我还将一些变量更改为常量,因为它们不需要 non-constants。我的结果如下所示:
await function execute() {
let response = await gapi.client.youtube.commentThreads.list({
"part": [
"snippet"
],
"fields":[
"items/snippet/topLevelComment/snippet(authorDisplayName,authorProfileImageUrl,publishedAt,textDisplay)"
],
"videoId": "XXXXX"
});
return response.result;
}
async function main(){
let response = await execute();
console.log(response);
}
我们还必须在 main()
函数中使用 async 和 await 的原因是,根据定义,异步函数总是 return promises。
要了解有关 async/await 的更多信息,我找到了这篇我喜欢其解释的文章:https://javascript.info/async-await
他们还有一篇关于承诺的文章:https://javascript.info/promise-basics