多次异步调用后回调?

安德鲁格

我正在使用Gmail API循环检索邮件,并对每封邮件执行req.write()。每个api调用都有一个回调,但是如何知道整个设置何时完成,以便结束响应?我尝试了以下操作,但注意到回调未按数组索引的顺序执行,所以我不能只做注释掉的那一行。

for (var i = 0; i < messages.length; i++) {
            var message = messages[i];
            console.log('- %s', message.id);
            (function(e){
              var request = gmail.users.messages.get({
                  auth:auth,
                  id:message.id,
                  userId: 'me'
                }, function(err, response) {
                  if(err) {
                    console.log('API returned an error: ' +err);
                    return;
                  }
                  res.write(JSON.stringify(response,null,'\t'));
                  console.log(e);
                  //if(e==messages.length-1) res.end();
                }
              );
            })(i);
}
TJ人群

不过,您走在正确的轨道上。由于在循环完成之前将不会获得任何回调,因此您只需跟踪已获得多少个回调以及何时到达messages.length,就可以知道已经完成了:

var completed = 0;
for (var i = 0; i < messages.length; i++) {
    var message = messages[i];
    console.log('- %s', message.id);
    var request = gmail.users.messages.get({
        auth: auth,
        id: message.id,
        userId: 'me'
    }, function(err, response) {
        if (err) {
            // Should increment and check `completed` here too,
            // not sure what you want to do though
            console.log('API returned an error: ' + err);
            return;
        }
        res.write(JSON.stringify(response, null, '\t'));
        if (++completed == messages.length) {
            res.end();
        }
    });
}

假设messages在此期间没有任何变化(影响其长度)。如果该假设无效,则可以completed将其反转,调用它pending,然后在达到0以下条件时就完成了

var pending = 0;
for (var i = 0; i < messages.length; i++) {
    var message = messages[i];
    console.log('- %s', message.id);
    var request = gmail.users.messages.get({
        auth: auth,
        id: message.id,
        userId: 'me'
    }, function(err, response) {
        if (err) {
            // Should decrement and check `pending` here too,
            // not sure what you want to do though
            console.log('API returned an error: ' + err);
            return;
        }
        res.write(JSON.stringify(response, null, '\t'));
        if (--pending === 0) {
            res.end();
        }
    });
    ++pending;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

访问异步调用的回调参数

来自分类Dev

使用Rhino从Java方法异步调用JavaScript回调

来自分类Dev

Nodejs异步调用排水回调完成之前

来自分类Dev

多次AJAX调用后,暂停执行AJAX回调

来自分类Dev

异步调用后DOM更新

来自分类Dev

异步调用后无法刷新UI

来自分类Dev

已使用异步调用回调?

来自分类Dev

如何在异步调用的流星方法上执行回调?

来自分类Dev

异步调用和回调之间有什么区别

来自分类Dev

异步调用完成后,回调/关闭如何知道要等待?

来自分类Dev

为什么异步调用不适用于回调模式?

来自分类Dev

for循环中的异步调用导致变量在回调中出错

来自分类Dev

如何处理来自带有回调的多个ajax异步调用的数据?

来自分类Dev

完成多个异步调用后,AJAX会启动最终的异步调用

来自分类Dev

Ajax回调多次调用

来自分类Dev

Ajax回调多次调用

来自分类Dev

异步调用后cudaFree是否起作用?

来自分类Dev

异步调用后如何自动对焦选择输入?

来自分类Dev

异步调用后cudaFree是否起作用?

来自分类Dev

Angular 4 - 在异步调用后显示消息

来自分类Dev

React Context API 在异步调用后不更新状态

来自分类Dev

HTML5 / Javascript GeoLocation:将数据传递给回调函数-或-暂停异步调用(带有Promise)?

来自分类Dev

如何在Scrapy / Twisted中使用线程,即如何在响应回调中异步调用阻塞代码?

来自分类Dev

从QML到带回调的Python的异步调用

来自分类Dev

Cakephp回调函数被多次调用

来自分类Dev

节点异步瀑布回调已被调用

来自分类Dev

NodeJS异步:已经调用了回调?

来自分类Dev

等待异步方法中的回调被调用

来自分类Dev

NodeJS异步:已经调用了回调?

Related 相关文章

热门标签

归档