微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我已经构建了一个以以下内容开头的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();

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

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

我试过了:
.myApp.getSent()来完成(myApp.gMailSyncComplete()); //没有定义jQuery

解决方法:

代码中的一些重要错误

>您正在创建一个接受回调的函数getSent,但您根本不会调用回调,因此它不会被执行.当其他一切都完成后,你应该执行回调.
>您不是在等待所有消息请求完成.您可以使用具有方法map的类似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()
    })
  })
}

>最后,在调用函数时,请记住回调参数必须是函数.

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐