无法从for循环中获取数据

时间:2016-07-12 05:58:13

标签: javascript for-loop asynchronous request

另一个问题......我有两个功能:

function(data, callback){              //F1
            var URL = 'url';
            request(URL, function(err, response, body) {
                if(response.statusCode == 200){
                    var json = JSON.parse(body);
                    var chid = [];
                        for(var i = 0; i < json['champions'].length;i++){
                        chid.push(json['champions'][i].id);
                    }
                    data.rotation = chid;
                    free = chid;
                    callback(null, data);
            }

        });
    },
function(data, callback) {        //f2
    for (var r=0; r<10; r++){
        var URL = 'url';
        request(URL,function(err, response, body) {
            if(response.statusCode == 200){
                var json = JSON.parse(body);

                x.push(json.name);
                data.rot = x;
            }   
        })
    }
    callback(null, data);
},

F1一切都好。如果我拨打console.log(free)console.log(data.rotation),我就会得到我想要的数组。

功能2有点问题。 for-loop之外的数据不可用。如果我在循环外拨打console.log(data.rot)console.log(x),则说它未定义,因此我无法通过把手获取它。我不知道它是关于回调(空,数据)位置还是关于for循环。我不能单独处理它。

  

如何访问for-loop之外的数据,以及如何修复此代码?

2 个答案:

答案 0 :(得分:0)

您正在循环中发出asynchronous个请求,并在循环外部访问 返回的值。 for-loop是同步的,但requests在其内部制作不是。

Promise.all可以使用,

  

Promise.all(iterable)方法返回一个承诺,该承诺在iterable参数中的所有承诺都已解决时解析,或者拒绝第一个通过的拒绝承诺的原因。

&#13;
&#13;
function abc(data, callback) {
  var arr = [];
  for (var r = 0; r < 10; r++) {
    var URL = 'url';
    var req = request(URL, function(err, response, body) {
      if (response.statusCode == 200) {
        var json = JSON.parse(body);

        x.push(json.name);
        data.rot = x;
      }
    });
    arr.push(req);
  }
  Promise.all(arr).then(function SuccessHandler(arrayOfResults) {
    callback(null, arrayOfResults);
  }, function ErrorHandler(reason) {
    console.log(reason)
  });
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

F2是异步的。所以要回调你需要等到请求返回:

function(data, callback) {        //f2
    for (var r=0, dataRx=0; r<10; r++){
        var URL = 'url';
        request(URL,function(err, response, body) {
            if(response.statusCode == 200){
                var json = JSON.parse(body);

                x.push(json.name);
                data.rot = x;
            }
            dataRx++;
            if(dataRx === 10) callback(null, data);
        })
    }

},