прерывается выполнения скрипта, без ошибки

276
28 мая 2022, 17:20

Есть несколько асинхронных функций которые вызываются вот так:

(async () => {
  console.log('1')
  await promisify(updateOrdersToAccepted)()
  console.log('2')
  await promisify(updateTo10)()
  console.log('3')
  await promisify(addOrdersToGoogleSheets)([4, 5, 6, 7, 8, 9, 10]);
  await promisify(ordersQuantity)('DB_LOGISTIC_STATISTICS')
  await promisify(ordersQuantity)('DB_LOGISTIC_STAT2')
})()

первая функция отрабатывает без ошибок и завершается.Все, дальше выполнения не идет.
В логах есть только 1.
Мб я что-то упускаю?

Answer 1

// Вот так (грубо говоря) работает promisify
function promisify(fn) {
  return (...args) => new Promise((resolve, reject) => {
    fn(...args, (err, result) => {
      if (err) return reject(err);
      resolve(result);
    });
  });
}
// Промисифицируемая функция должна принимать (err, result) => {} функцию последним аргументом
function someFunc(a, next) {
  setTimeout(() => next(null, a), 100);
}
const someFuncPromisified = promisify(someFunc);
(async () => {
  console.log(1);
  const res = await someFuncPromisified(42);
  console.log(res);
  console.log(2);
})();

Answer 2

Вообщем нашел решение сам. В функциях добавил параметр next и в конце функции вызывал его,заработало как надо

Answer 3

Думаю как-то так.

function promisify(func) {
  return new Promise((res, err) => {
    setTimeout(() => {
    res(func);
  }, 1000);
  });
}
function updateOrdersToAccepted(){
  console.log("call updateOrdersToAccepted");
}
function updateTo10() {
  console.log("call updateTo10");
}
function addOrdersToGoogleSheets(array){
  console.log(`call addOrdersToGoogleSheets with params ${[...array]}`);
}

function ordersQuantity(param){
  console.log(`call ordersQuantity with params ${param}`);
}

(async () => {
  console.log('1');
try {
  (await promisify(updateOrdersToAccepted))();
  console.log('2');
  (await promisify(updateTo10))();
  console.log('3');
  (await promisify(addOrdersToGoogleSheets))([4, 5, 6, 7, 8, 9, 10]);
  (await promisify(ordersQuantity))('DB_LOGISTIC_STATISTICS');
  (await promisify(ordersQuantity))('DB_LOGISTIC_STAT2');
  }
  catch (e){
    console.log(e);
  }
})()

У вас ошибка в попытке вызвать результат промиса когда он ещё не пришел.

await promisify(ordersQuantity)('DB_LOGISTIC_STATISTICS');

а нужно обернуть результат и потом вызвать.

(await promisify(ordersQuantity))('DB_LOGISTIC_STATISTICS');

В моём примере promisify это моя функция чисто для примера.

READ ALSO
Сохранение передаваемых params во vueRouter

Сохранение передаваемых params во vueRouter

Есть динамический роут, который выводит отфильтрованный список товаров, фильтрация происходит в getter во vuex, все бы ничего, но если перезагрузить...

135
Как вывести ключ и значение TreeMap

Как вывести ключ и значение TreeMap

Если пишем новое имя, программа просит ввести номер телефона и запоминает егоЕсли новый номер телефона — просит ввести имя и также запоминает

158