Javascript和回调和deferred.如何在google gmail API请求完成后运行某个功能?

Rya*_*yan 3 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 {
Run Code Online (Sandbox Code Playgroud)

这些函数声明如下:

    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);
      });
    });
  },
Run Code Online (Sandbox Code Playgroud)

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

myApp.init();
Run Code Online (Sandbox Code Playgroud)

在谷歌请求函数getsent()完全完成后,如何推迟运行函数.我已经尝试将回调用于另一个函数并且它运行但是当getsent()仍在执行时它会运行.完成后我可以使用jQuery方法来运行回调吗?

我试过了:myApp.getSent(myApp.gMailSyncComplete()); //尽早运行

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

Dan*_*ola 6

代码中的一些重要错误:

  • 您正在创建一个getSent接受回调的函数,但您根本不会调用回调,因此它不会被执行.当其他一切都完成后,你应该执行回调.
  • 您不是在等待所有消息请求完成.您可以使用像async这样的库,它具有方法映射,能够并行执行所有请求,并在调用回调之前等待所有请求完成.

考虑到这两件事,并使用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()
    })
  })
}
Run Code Online (Sandbox Code Playgroud)
  • 最后,在调用此函数时,请记住该callback参数必须是函数.

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

var callback = myApp.gMailSyncComplete()
myApp.getSent(callback)
Run Code Online (Sandbox Code Playgroud)

执行此操作时,您没有传递函数,而是传递函数的结果,因为您正在执行它.这就是它立即执行的原因.正确的方法是:

var callback = myApp.gMailSyncComplete
myApp.getSent(callback)
Run Code Online (Sandbox Code Playgroud)

或者,在你的单线示例中, myApp.getSent(myApp.gMailSyncComplete)