Size: a a a

NodeUA - JavaScript and Node.js in Ukraine

2021 September 12

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
У тебя console.log видимо срабатывает быстрее чем твои асинхронные операции
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
так и есть, и я вот пытаюсь понять как дождаться результата
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Можно колбэк в read обернуть в промис и ждать выполнения
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Хотя блин
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Ну да
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Возвращаешь new Promise из функции и делаешь resolve внутри твоего колбэка
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
а обязательно ли здесь промисы использовать? async/await не подойдет?
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Async / await ждут результат промиса. Это не какая-то магия
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Поэтому промис обязательно
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
ок, сейчас попробую, спс
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Так как у тебя нет поддержи встроенной промисов, можно оборачивать в свои
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
Думаю как сделать, пока решил так:
  const array = [];

 let promise = new Promise(function (resolve, reject) {
   input.size((size) => {
     for (let i = 0; i < size; i++) {
       let promises = [];

       promises.push(
         new Promise(function (resolve, reject) {
           input.read(i, (file) => {
             array.push(file);
           });
         })
       );

       Promise.all(promises).then((values) => {
         resolve();
       });
     }
   });
 });

 await promise;

 console.log(array);

но не верно, пустой массив в логи выводится.
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
@Hdhrer4 есть идеи?
источник

M

Merry in NodeUA - JavaScript and Node.js in Ukraine
Что-то вы намудрили. В конструктор промиса просто передайте вашу функцию и внутри после цикла сделайте resolve(array)
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
можете показать пример?
источник

M

Merry in NodeUA - JavaScript and Node.js in Ukraine
const array = [];

 input.size((size) => {
   for (let i = 0; i < size; i++) {
     input.read(i, (file) => {
       array.push(file);
     });
   resolve(array)
 });

Только оберните в промис, с телефона неудобно
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
ага, спс, сейчас попробую
источник

AK

Alexandr Kazakov in NodeUA - JavaScript and Node.js in Ukraine
Вот кажется по твоему примеру:

  const array = [];

 let promise = new Promise(function (resolve, reject) {
   input.size((size) => {
     for (let i = 0; i < size; i++) {
       input.read(i, (file) => {
         array.push(file);
       });
     }
     resolve(array);
   });
 });

 promise.then((array) => {
   console.log(array);
 });
пустой массив выводит. Да и мне и самому непонятно, почему здесь должен быть результат, ведь как я сказал, в цикле метод input.read также асинхронный.
Мне кажется, что этот код не ждет промисы в цикле...
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Не не, каждый вызов твоей функции с колбэком
источник

MA

Maksim Andreevich in NodeUA - JavaScript and Node.js in Ukraine
Это должен быть промис
источник