функция должна запускать код последовательно в пределах Javascript - PullRequest
0 голосов
/ 04 августа 2020

Здравствуйте, у меня есть функция. Внутри функции я запускаю al oop. после запуска l oop у меня есть оператор IF. Проблема здесь в том, что javascript, как мы все знаем, является асинхронным. Можно ли сделать это неасинхронным? На этом l oop заканчивается, а затем переходит к оператору IF. Ниже моя функция:

    async function analyzeVins() {
       const vinsToAnalyze = vins.split('\n');

    if (vinsToAnalyze.length === 0) {
      return;
    }

    for (let x = 0; x < vinsToAnalyze.length; x++) {
      if (vinsToAnalyze[x].length > 10) {
        setErrorVinsArr([...errorVinsArr, vinsToAnalyze[x]]);
      } else {
        setValidatedVins([...validatedVins, vinsToAnalyze[x]]);
      }
    }
    if (missingVinsArr.length <= validatedVins.length) {
         console.log('valid');
       } else {
         console.log('invalid');
       }
   }

1 Ответ

0 голосов
/ 04 августа 2020
(function(cb) {

    for (let x = 0; x < vinsToAnalyze.length; x++) {
      if (vinsToAnalyze[x].length > 10) {
        setErrorVinsArr([...errorVinsArr, vinsToAnalyze[x]]);
      } else {
        setValidatedVins([...validatedVins, vinsToAnalyze[x]]);
      }

   ## return callback when everything is done.
   ## Follow the pattern of shouting only after barking is done below 
   ## if `setErrorVinsArr` is supposed to take more time also.
   return cb();
 })(findMissing)
    
 function findMissing () {
    
    if (missingVinsArr.length <= validatedVins.length) {
         console.log('valid');
       } else {
         console.log('invalid');
       }
  }

Таким образом вы можете синхронно выполнять код. Например,

function shout() {
    console.log('SHOUT')
}

Вы хотите запустить shout, но только после того, как некоторая функция fini sh лает первой. Таким образом, вы должны передать shout лай как ссылку, это будет вызываться как обратный вызов, когда лай закончится.

(function(cb) { 
  console.log('barking');
  setTimeout(function(){ 
    console.log('barking finished');
    cb() 
  }, 2000);
  console.log('still barking would finish after 2000');
})(shout)

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

...