Как я могу вызвать решимость в обещании, проходя через объект, который удовлетворяет только определенным условиям? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть функция, которая содержит обещание, которое содержит функцию setTimeout.Функция set timeout выполняет циклический осевой вызов, который распределяет вызовы, чтобы избежать ошибки ограничения скорости.Это прекрасно работает, хотя и немного медленно.Что я хотел бы сделать, это перенаправить после того, как все звонки были завершены.Я установил остаток, равный последнему возвращенному элементу.Где я запутался в том, как сравнить это с массивом массивов в цикле 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')
   })

Результат должен зацикливатьсячерез длину Объектов и вернуть функцию разрешения, если последние элементы соответствуют (если они достигли конца)

1 Ответ

0 голосов
/ 21 июня 2019

Судя по вашим комментариям, вы просто пытаетесь понять, как узнать, когда был выполнен последний запрос.Для этого я бы предложил просто поместить все обещания в массив и использовать Promise.all() в массиве обещаний, чтобы знать, когда они все будут выполнены.Таким образом, Promise.all() сделает всю работу за вас, чтобы поддерживать счетчики, чтобы знать, когда все запросы выполнены.

Я также заменил ваше использование setTimeout() на служебную функцию на основе обещаний delay()это лучше сочетается с обещаниями.

// 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() возвращает обещание, которое разрешается до его возвращенного значения.

  2. Я не пытался переписать / исправить вашу задержку, чтобы обойти ограничение скорости.То, что у вас есть, очень примитивно и, вероятно, будет недостаточно, если contianerT - большой массив.

  3. Массивы следует повторять с for/of, а не for/in, потому что for/inповторяет свойства объекта, а не элементы массива.Итак, for (let m in contianerT) выглядит неправильно.Кроме того, обратите внимание, что большинство людей пишут это как «контейнер».

PS Обычно я даже не занимаюсь вопросами, которые являются преимущественно псевдокодом, потому что часто спрашивающий даже не знаетвсе проблемы задавать или не задавать правильный вопрос, и мы можем быть намного точнее, предлагая лучший ответ, когда видим реальный код.Пожалуйста, оставьте свой РЕАЛЬНЫЙ код в следующий раз.Вы будете приятно удивлены тем, насколько лучше люди могут вам помочь и насколько больше вы получите помощи для вещей, о которых вы даже не знали, что есть лучший способ сделать это.

...