简体   繁体   English

javascript在嵌套函数中将项目添加到全局数组,使用gmail api不会将更改反映到外部

[英]javascript adding items to global array in nested function, changes are not reflected outside using gmail api

So i have this code 所以我有这个代码

  function addEmail(e){
      emails.push(e);
  }
  var emails = new Array;

  function getMessage( messages, callback ) {

      var get = function(len){


        //console.log(messages[len].id);
        var request = gapi.client.gmail.users.messages.get({
            'userId': 'me',
            'id': messages[len].id
          });
        request.execute(function(response){
            var e = parseMessages(response)
            //console.log(JSON.stringify(e));
            addEmail(e);    

        });
        len++;

        if(len<messages.length){
            console.log(emails.length);
            get(len);
        }
        else{
            console.log(emails.length);
            process(emails);
        }

      }
      get(0);


  };

when i am trying to access the emails array outside the method getMessage it is empty. 当我尝试访问方法getMessage之外的emails数组时,它为空。 this line of code "console.log(emails.length);" 此行代码“ console.log(emails.length);” always prints 0, 总是打印0,
however when i put this line of code inside get method, it shows values are being added to the array 但是,当我将这行代码放入get方法中时,它表明值正在添加到数组中

when i am trying to access the emails array outside the method getMessage it is empty. 当我尝试访问方法getMessage之外的emails数组时,它为空。 this line of code "console.log(emails.length);" 此行代码“ console.log(emails.length);” always prints 0 总是打印0

Timing! 定时!

I'm pretty sure, you wanted to build this: 我很确定,您想要构建以下代码:

function getMessage( messages, callback ) {
    var emails = [];
    get(0);

    function get(index){
        if(index === messages.length){
            return callback(emails);
        }

        //console.log(messages[index].id);
        var request = gapi.client.gmail.users.messages.get({
            'userId': 'me',
            'id': messages[index].id
        });

        request.execute(function(response){
            var e = parseMessages(response)
            //console.log(JSON.stringify(e));
            emails.push(e);
            get(index+1);
        });
    }
}


getMessage( someMessages, function(emails){
    console.log(emails);
})

or paralell: 或并列:

function getMessage( messages, callback ) {
    function done(){
        if(--pending) return;   //still work left
        callback(emails);
    }

    var pending = 1, 
        emails = Array(messages.length);

    messages.forEach(function(msg, i){
        ++pending;

        var request = gapi.client.gmail.users.messages.get({
            'userId': 'me',
            'id': msg.id
        });

        request.execute(function(response){
            emails[i] = parseMessages(response);
            done();
        });
    });

    done();
}
  • not tested 未经测试

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM