JS: не уверен, когда использовать Promise.resolve() против возврата нового обещания

#javascript

#javascript

Вопрос:

Я не уверен, как использовать возврат a new Promise по сравнению с использованием a Promise.resolve() , и хочу убедиться, что мое понимание этого правильное.

Учитывая эти 3 функции ниже:

     function testFunc() {
          return Promise.resolve().then(() => {
             //anything asynchronous in here has now become synchronous and 
             //execution of result of the function happens after this??
              let i = 0;
              while (i < 10000) {
                 console.log(i);
                 i  ;
              }
          });
    }
------
    function testFunc2() {
          return new Promise((resolve, reject) => {
               //anything asynchronous in here is still asynchronous but the 
               //`resolve()` is then synchronous?? 
               let i = 0;
                while (i < 10000) {
                  if (i === 999) { resolve('I am a test func') };
                  i  ;
                }
          })
    }
------

    //synchronous function 
    
    function logMe() {
         let i = 0;
         while (i < 10000) {
            console.log("INSIDE LOG ME);
            i  ;
         }
    }
 

Насколько я понимаю, это testFunc() немедленно разрешает обещание, и все, что там находится, становится синхронным. Так что, если вы должны были выполнить:

 testFunc();
logMe();
 

testFunc() будет полностью выполнено до logMe() того, как будет достигнуто и выполнено.

Для testFunc2() , если бы оно было выполнено в таком порядке:

    testFunc2();
   logMe();
 

Я понимаю это как логику внутри, в данном случае цикл while, все равно будет выполняться синхронно и задерживать выполнение следующей функции, logMe() , но resolve будет обрабатываться асинхронно.

Ответ №1:

Это не так просто. Вам придется использовать test Func.then(logMe()) . Другим вариантом было бы запустить обе функции в асинхронной функции:

 async function run() {
  await testFunc();
  logMe();
}
 

Это await довольно просто — он запускает функцию и ожидает ее завершения, затем запускает следующие строки. async это просто так, что await может работать (await не работает вне асинхронных функций).

Я предпочитаю async / await , но многие предпочитают .then . Это именно то, что вы хотите использовать, оба очень похожи.

Ответ №2:

Если я правильно понимаю, чего вы пытаетесь достичь, вы хотите асинхронно выполнить операцию внутри цикла.

 
function testFunc2() {
  const promises = []
  for(let i = 0; i<1000; i  ){
       promises.push(new Promise((resolve) => {
         console.log(i);
         resolve()
       }));
     }
  return Promise.all(promises);
}

function logMe() {
  let i = 0;
  while (i < 5) {
     console.log("INSIDE LOG ME");
     i  ;
  }
}

(async() => {
  await testFunc2()
  logMe();
})();

 

Комментарии:

1. Спасибо. Я просто пытаюсь понять, что делают эти функции и как они по-разному влияют на цикл событий