首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在遍历仅满足特定条件的对象时,如何在promise中调用resolve?

在遍历仅满足特定条件的对象时,如何在promise中调用resolve?
EN

Stack Overflow用户
提问于 2019-06-21 06:00:22
回答 1查看 26关注 0票数 0

我有一个包含promise的函数,promise包含一个setTimeout函数。set timeout函数通过展开调用的axios调用进行循环,以避免速率限制错误。这工作得很好,虽然有点慢。我想做的是在所有调用完成后重定向。我将余数设置为等于返回的最后一个元素。我对如何将其与foreach循环中的数组数组进行比较感到困惑。这里最好的方法是创建一个满足if条件的返回索引的新数组吗?如果有任何反馈,我们将非常感谢。

我尝试过基于值和索引创建一个新的数组,但是我对如何在if条件中正确地做到这一点有点生疏

代码语言:javascript
复制
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函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-21 07:39:48

从您的评论中,听起来您只是想弄清楚如何知道最后一个请求何时完成。为此,我建议将所有的承诺放入一个数组中,并对承诺数组使用Promise.all(),以了解它们何时全部完成。这样,Promise.all()将为您完成维护计数器的所有工作,以了解所有请求何时完成。

我还用一个基于promise的实用函数delay()替换了您对setTimeout()的使用,该函数可以更好地与promise混合。

代码语言:javascript
复制
// 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');
});

备注:

  1. 我假设axios.post()返回一个promise,解析为它的返回值。
  2. 我没有试图重写/修复你的延迟来绕过速率限制。您所拥有的是非常原始的,如果contianerT是一个大的array.
  3. Arrays应该用for/of而不是for/in迭代,这可能是不够的,因为for/in迭代的是对象属性,而不是数组元素。因此,for (let m in contianerT)看起来不正确。此外,请注意,大多数人将其拼写为"container".

附注:通常情况下,我甚至不会涉及主要是伪代码的问题,因为通常提问者甚至不知道要问的所有问题,或者没有问对问题,当我们看到真正的代码时,我们可以更准确地提供最佳答案。请下次发布你的真实代码。你会惊喜地发现,人们可以更好地帮助你,你甚至不知道有更好的方法可以完成的事情,你会得到更多的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56694416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档