Асинхронное ожидание / ожидание после исчезновения, когда оно завершено - PullRequest
0 голосов
/ 04 октября 2019

У меня есть этот фрагмент кода, который в основном выполняет: - Когда выполняется ajax (обещание): - Исчезновение и когда завершение исчезновения: - Появление:

async function loadForm (data) {

   let promiseForm = pForm(data);
   await promiseForm.then(function(data) {

          setTimeout(function () {

            $container.fadeOut(function() {
                $container.append(msg);
                $container.fadeIn();
            });

          }, 800);
    });

}

Но теперьмне нужен дескриптор, тогда все это будет сделано

Я пробовал этот код, но не работал, потому что селектор Jquery выполняется до обратного вызова затухания, поэтому $ container html еще не добавлен.

async function loadForm (data) {

 let promiseForm = pForm(data);
 await promiseForm.then(function(data) {

        setTimeout(function () {

          $container.fadeOut(function() {
              $container.append(msg);
              $container.fadeIn();
          });

        }, 800);

  });

}
async function checkActiveForm() {

  let promiseActiveForm = pCheckActiveForm
  await promiseActiveForm.then((json) => {

          loadForm(data).then(function() {
              $(document).find("#"+logEvento.id).prop('checked',true); 
              //This element is created on the $container.append(msg) of "A" function
          });
  });

}


решено:

async function loadForm (data) {

   let promiseForm = pForm(data);
   var msg ;
   await promiseForm.then(function(data) {
       msg = response;
    });

    await new Promise(res => {
       setTimeout(function () {

          $container.fadeOut(function() {
             $container.append(msg);
             $container.fadeIn();

             res();
          });

        }, 800);
    }

}

1 Ответ

1 голос
/ 04 октября 2019

JavaScript не знает, что setTimeout является асинхронным, и вы не говорите об этом никоим образом. Вы должны сказать, что в обратном вызове setTimeout поток синхронизируется снова.

Вместо этого вы запускаете тайм-аут и идете вперед (и не важно, находится ли он внутри обещания!).

Кроме того, ваше ожидание бесполезно, потому что вы ждете два обещания, чтобы решить, но вы ничего не делаете после того, как вы ждали.

Возможно, вы имели в виду что-то вроде этого:

await promiseForm; // Wait the first promise
await new Promise (res => { // Wait the timeout
      setTimeout(function () {
        $container.fadeOut(function() {
            $container.append(msg);
            $container.fadeIn();
            res();
        });
      }, 800);
});
// Do something after that everything happened

PS. Нужно ли выполнять два обещания по очереди? Разве вы не можете распараллелить их (получить улучшение производительности)?

Может быть, вы могли бы использовать Promise.all

...