处理 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