Javascript 和回调以及延迟。 google gmail API 请求完成后如何运行函数?

标签 javascript jquery callback

我建立了一个以以下内容开头的 javascript 文件:

var myApp = function () {

var CLIENT_ID = 'xxxxxxx';
var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest"];
var SCOPES = 'https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/analytics.readonly https://www.googleapis.com/auth/drive.readonly';
var authorizeButton = document.getElementById('authorize-button');

return {

函数声明如下:

    getSent: function(callback) {
    var request = gapi.client.gmail.users.messages.list({
      'userId': 'me',
      'labelIds': 'SENT',
      'maxResults': 10
    });

    request.execute(function(response) {
      $.each(response.messages, function() {
        var messageRequest = gapi.client.gmail.users.messages.get({
          'userId': 'me',
          'id': this.id
        });


        messageRequest.execute(myApp.appendMessageRow);
      });
    });
  },

然后运行调用其他函数的单个函数:

myApp.init();

如何在我的 google 请求函数 getsent() 完全完成后延迟运行一个函数。我已经尝试使用回调到另一个函数并且它运行但它在 getsent() 仍在执行时运行。我可以使用延迟的 jQuery 方法在完成后运行回调吗?

我试过: myApp.getSent(myApp.gMailSyncComplete());//提前运行

我试过: myApp.getSent().done(myApp.gMailSyncComplete());//没有定义 jQuery done

最佳答案

代码中的一些重要错误:

  • 您正在创建一个接受回调的函数 getSent,但您根本没有调用回调,因此它永远不会被执行。当其他一切都完成后,您应该执行回调。
  • 您没有等待所有消息请求完成。您可以使用类似 async 的库它有方法 map能够并行执行所有请求并在调用回调之前等待所有请求完成。

考虑到这两件事,并使用 async,这将是生成代码的示例:

getSent: function (callback) {
  var request = gapi.client.gmail.users.messages.list({
    'userId': 'me',
    'labelIds': 'SENT',
    'maxResults': 10
  })

  request.execute(function (response) {
    async.map(response.messages, function (msg, cb) {
        var messageRequest = gapi.client.gmail.users.messages.get({
          'userId': 'me',
          'id': msg.id
        })

        messageRequest.execute(function (result) {
            myApp.appendMessageRow(result)
            cb()
        })
    }, function (err) {
      if (err) throw err
      callback()
    })
  })
}
  • 最后,调用此函数时,请记住callback 参数必须是一个函数。

为了清楚起见,让我们将您编写的代码 myApp.getSent(myApp.gMailSyncComplete()) 翻译成等效的结构:

var callback = myApp.gMailSyncComplete()
myApp.getSent(callback)

执行此操作时,您不是传递函数,而是传递函数的结果,因为您正在执行它。这就是它被立即执行的原因。执行此操作的正确方法如下:

var callback = myApp.gMailSyncComplete
myApp.getSent(callback)

或者,在您的单行示例中,myApp.getSent(myApp.gMailSyncComplete)

关于Javascript 和回调以及延迟。 google gmail API 请求完成后如何运行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312711/

相关文章:

jquery - 根据其他 div 的背景颜色更改 div 的背景颜色

ios - 如何使用 Swift 回调闭包在 Controller 、检查器之间传递数据

java - JNI - 如何从 C++ 或 C 回调到 Java?

java - 如何安全地装饰现有的回调?

javascript - ng-repeat 垂直溢出

javascript - setInterval() 无法正常工作

javascript - 我如何调整这个 .when getJSON 以返回按日期排序的结果?

javascript - Angular JS $scope 查询

php - 如何优化和/或简化 jQuery 和 PHP 的交互?

php - 检查哪些用户在线