我有一个包含promise的函数,promise包含一个setTimeout函数。set timeout函数通过展开调用的axios调用进行循环,以避免速率限制错误。这工作得很好,虽然有点慢。我想做的是在所有调用完成后重定向。我将余数设置为等于返回的最后一个元素。我对如何将其与foreach循环中的数组数组进行比较感到困惑。这里最好的方法是创建一个满足if条件的返回索引的新数组吗?如果有任何反馈,我们将非常感谢。
我尝试过基于值和索引创建一个新的数组,但是我对如何在if条件中正确地做到这一点有点生疏
async function axiosRequest() {
let newT = {
value: {
test: 't',
test2: 't2',
test3: 't3',
test4: 't4',
test5: '',
test6: ''
}
}
let contianerT = [];
const promise = new Promise((resolve, reject) => {
for (let m in contianerT) {
let remainder = Object.keys(contianerT[m].value).length
Object.entries(contianerT[m].value).forEach(([key, value], index, array) => {
let newArray = [];
if (value !== "") { //don't loop through empty values
// let len = Object.keys(value).length
//let last_element = sortedKeys[sortedKeys.length - 1];
setTimeout(() => {
remainder--;
//axios.post('/url',{key: key, value: value}) lives here
// len --;
console.log(remainder)
//console.log(len)
//console.log(index)
if (remainder === index) {
resolve();
}
}, 500 * index);
}
});
}
});
await promise
}
axiosRequest()
.then(() => {
console.log('redirect')
})
结果应该循环遍历对象的长度,如果最后一个元素匹配(如果它们已经到达末尾),则返回resolve函数
发布于 2019-06-21 07:39:48
从您的评论中,听起来您只是想弄清楚如何知道最后一个请求何时完成。为此,我建议将所有的承诺放入一个数组中,并对承诺数组使用Promise.all()
,以了解它们何时全部完成。这样,Promise.all()
将为您完成维护计数器的所有工作,以了解所有请求何时完成。
我还用一个基于promise的实用函数delay()
替换了您对setTimeout()
的使用,该函数可以更好地与promise混合。
// helper function that returns a promise
// that resolves after a timeout time
function delay(t, v) {
return new Promise(resolve => {
setTimeout(() => {
resolve(v);
}, t);
});
}
function axiosRequest() {
let newT = {
value: {
test: 't',
test2: 't2',
test3: 't3',
test4: 't4',
test5: '',
test6: ''
}
}
let promises = [];
let contianerT = [];
for (let m of contianerT) {
Object.entries(contianerT[m].value).forEach(([key, value], index, array) => {
if (value !== "") { //don't loop through empty values
// let len = Object.keys(value).length
//let last_element = sortedKeys[sortedKeys.length - 1];
promises.push(delay(500 * index).then(() =>
return axios.post('/url',{key: key, value: value}); // I assume this returns a promise
}));
}
});
}
// returns a promise that resolves to an array of axios.post() results
return Promise.all(promises);
}
axiosRequest().then(() => {
console.log('redirect');
});
备注:
axios.post()
返回一个promise,解析为它的返回值。contianerT
是一个大的array.for/of
而不是for/in
迭代,这可能是不够的,因为for/in
迭代的是对象属性,而不是数组元素。因此,for (let m in contianerT)
看起来不正确。此外,请注意,大多数人将其拼写为"container".附注:通常情况下,我甚至不会涉及主要是伪代码的问题,因为通常提问者甚至不知道要问的所有问题,或者没有问对问题,当我们看到真正的代码时,我们可以更准确地提供最佳答案。请下次发布你的真实代码。你会惊喜地发现,人们可以更好地帮助你,你甚至不知道有更好的方法可以完成的事情,你会得到更多的帮助。
https://stackoverflow.com/questions/56694416
复制相似问题