Делать время для проверки правильности значения или нет - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть 2 переменные, и я хочу сделать что-то, когда они изменились на одно и то же значение, как друг друга.Итак, это мой код:

var val_1,val_2;
for(i=0;i<=5;i++){
    readyforgo++;
    $.post("somewhere.php",{
        something: something
    },function(data, status){
        readytogo++;
    });
}
if(readyforgo==readytogo){
    alert(1);
}

Он не вернет 1, потому что мой if работает быстрее, чем мой $.post Я имею в виду, я хочу какой-то код, подобный этому:

function checker(){
    if(readyforgo==readytogo){
        alert(1);
    }else{
        setTimeout(function(){checker();},100);
    }
}
checker();

Егоработает хорошо, но я ищу что-то лучше, я имею в виду, я не хочу использовать подобный код, потому что он использует cpu и ram, пока не попытается получить readyforgo==readytogo у нас есть такой код?я не люблю использовать setTimeout или setInvertal или что-то подобное.

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Вы можете использовать Promise.all(promises).

  • Ваш $ .post должен быть адаптирован для создания обещания, если оно уже не возвращает его.(См. Комментарий от georg)
  • Вы бы поместили каждое обещание в массив.
  • Promise.all будет вызываться после завершения всех асинхронных вызовов.
const promises = []
for(let i=0; i<5; i++){
  // assuming your post returns a promise
  promises.push($.post("somewhere.php"))
}
Promise.all(promises).then(results=>{
  // your code here
})

Если ваш код находится в блоке async, вы можете сделать следующее и избежать вложенных функций:

results = await Promise.all(promises)
// your code here
})

Этот шаблон ожидания для всех обещаний очень распространен после отправки нескольких асинхронных вызовов.

0 голосов
/ 21 сентября 2019

Если вы хотите проверить, когда все сообщения были разрешены или отклонены, вы можете воспользоваться преимуществами отложенных объектов jQuery (аналогично обещаниям).Создайте массив отложенных объектов jQuery, а затем используйте when, чтобы дождаться, пока все они не будут разрешены / отклонены.

// Create an array of POST deferred objects
function getDeferreds() {
  const deferreds = [];
  for (let i = 0; i <= 5; i++) {
    deferreds.push($.post("somewhere.php", { something: something }));
  }
  return deferreds;
}

// $.when works similarly to Promise.all
$.when.apply(null, getDeferreds()).then(data => {
  alert(1);
});

Вот хорошее объяснение, почему apply был использован в этом примере.

0 голосов
/ 21 сентября 2019

Почему бы вам не добавить проверку внутри блока ответа?

function(data, status){
    readytogo++;
    if (readyforgo == readytogo) {
        alert(1);
    }
});

????

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...