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