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');
});