我建立了一个以以下内容开头的 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/