the code is as follows:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value=>{
setTimeout(()=>{
data.push(value);
},1000);
});
//?data
}
the code is as follows:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value=>{
setTimeout(()=>{
data.push(value);
},1000);
});
//?data
}
you can use Promise.all
or for of
plus async/await
.
function pushData(arr, value) {
return new Promise((reslove) => {
setTimeout(() => {
arr.push(value);
console.log('push data over', value)
reslove();
}, 1000);
})
}
async function longTimeDo() {
let data = [];
let sourse = [1, 2, 3, 4, 5];
for (let value of sourse) {
await pushData(data, value);
}
console.log(data)
}
longTimeDo();
this will not work:
function longTimeDo() {
let data = [];
let sourse = [1,2,3,4,5];
sourse.forEach(value => {
console.log('forEach-star')
setTimeout(() => {
data.push(value);
console.log('forEach-async')
}, 1000);
console.log('forEach-end')
});
console.log('longTimeDo-end');
}
longTimeDo();
output is
from the results, we can see that the asynchrony in the loop only acts in the loop, but does not affect the outside of the loop. If you want this function to return the result after asynchronism, it is equivalent to asynchronously changing Synchronize, then you need to use Primise
.async function longTimeDo () {
let data = [];
let sourse = [1,2,3,4,5];
let allP = sourse.map(value => {
return new Promise((res, rej) => {
setTimeout(() => {
data.push(value+1);
res(data)
}, 1000);
});
});
await Promise.all(allP);
return data;
}
longTimeDo().then(res => {
log(res) // [2, 3, 4, 5, 6]
})
The most low way of is to add a count, num=0;settimeout to add 1 at a time, and to judge return data when num==source.length
.requirements: use Github V3 version of API to get the number of items of a user s star. and user s api does not provide the number of star separately, but provides such an interface " starred_url ": " https: api.github.com users tj starred{ ow...