Javascript 知道forEach循环何时完成

Javascript 知道forEach循环何时完成,javascript,json,loops,promise,Javascript,Json,Loops,Promise,我如何知道我的代码何时完成循环?在它完成后,我必须运行更多的代码,但它只能在我在那里写的所有东西都完成后才能运行 obj.data.forEach(function(collection) { var serialized_array = collection['quiz_ids']; quiz_collections.push([collection['id'], collection['name'], collection['t

我如何知道我的代码何时完成循环?在它完成后,我必须运行更多的代码,但它只能在我在那里写的所有东西都完成后才能运行

obj.data.forEach(function(collection) {
                var serialized_array = collection['quiz_ids'];
                quiz_collections.push([collection['id'], collection['name'], collection['type'], collection['category'], serialized_array.split(',')]);

                serialized_array.split(',').forEach(function(ite) {
                  query('./php/query.php', 2, [['quiz_id', ite]]).then(function(quiz_obj) {
                    if (quiz_obj.data[0] == 'false') {

                    }
                    else {
                      fetch(quiz_obj.data[0]['data']).then(function(resp) {
                        return resp.json();
                      })
                      .then(function(data) {
                        console.log(data);
                        quiz_data.push([quiz_obj['id'], quiz_obj['name'], quiz_obj['version'], quiz_obj['data'], data]);
                      });
                    }
                  });
                });
              });   
如果有帮助的话。第一行中我的obj.data如下所示:

这是我的查询功能:

function query(url, cmd_type, data_array) {
  var request = new XMLHttpRequest();
  var params= '';
  params = params + 'cmdtype=' + encodeURIComponent(cmd_type) + '&';
  if (data_array) {
    data_array.forEach(function(item) {
      params = params + item[0] + '=' + encodeURIComponent(item[1]) + '&';
    });
  }

  console.log(params);

  return new Promise(function(resolve, reject) {
    request.open('POST', url, true);
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    request.onreadystatechange = function() {
      if (request.readyState === XMLHttpRequest.DONE) {
        if (request.status === 200) {
          var response = JSON.parse(request.response);
          resolve(response);
        }
        else {
          resolve({error: 'Cant connect!'});
        }
      }
    };
    request.send(params);
  });
}
提前感谢

菲利普

这样做的一种方法是。
您可以将获取承诺推送到数组中,一旦forEach循环完成,调用Promise.all:

const promises = [];

// start loop
const promise = query(...);
promises.push(promise);
// end loop
Promise.all(promises).then((values) => doSomething(values));

这就解决了您的问题,但是有更好的方法可以做到这一点,例如使用。RxJS在处理更复杂的异步代码时非常有用。

promise应该有一个.then方法,该方法在完成时调用。then方法将接收一个要调用的函数

var promise = // your code that gets the promise ( a call to query)
promise.then((values) => {//code to run afterwards})
您可以使用一个接一个地履行承诺,而不是

例如:

const data=[1,2,3,4,5];
const loopResult=data.reduce(异步(上一个,值)=>{
//等待上一个循环完成
等待前世;
//回报新的承诺
返回新承诺((解决)=>{
//承诺码
//在此处进行HTTP获取。。。
解决();
});
},Promise.resolve());
loopResult.then(()=>{
log('loop finished');
});
或者,如果您的循环不需要有序,您可以使用:

const loopResult=Promise.all(
data.map((值)=>新承诺((解析)=>{
//承诺码
//在此处进行HTTP获取。。。
解决();
}))
);
loopResult.then(()=>{
log('loop finished');
});