Как превратить асинхронный код в синхронный - nodejs? - PullRequest
0 голосов
/ 25 июня 2018

Это код моего nodejs API:

exports.createBusiness = (req, res) => {
  const business = { name: req.body.name };
  Business.create(business)
    .then(() => {
      createSchema() // this function, i pasted below

        .then(() => {
          console.log('6 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
        });
    })
    .catch((err) => {
      console.log('err:', err);
    });
};

Моя функция:

const createSchema = () => Business.findAll({
  raw: true,
}).then((data) => {
  console.log('1  >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

  data.forEach((client) => {
    console.log('2  >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

    postgresDB.createSchema(client.code).then(() => {
      console.log('3 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

      Object.keys(postgresDB.models).forEach((currentItem) => {
        console.log('4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

        postgresDB.models[currentItem].schema(client.code).sync();
        console.log('5 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
      });

      console.log('Postgres schema created');
    });
  });
}).catch((err) => {
  console.log('Warning:', err.message);
});

Мой вывод теперь поступает в консоль в следующем порядке:

1  
2  
2  
2  
2  
2  
2  
2  
2  
2  
6 



3
4 
5 

Мой ожидаемый вывод будет в консоли: (мне нужно выполнить синхронно):

1  
2  
2  
2  
2  
2  
2  
2  
2  
2  

3
4
5

6

Как заставить это вести себя синхронно, используя обещания или обратные вызовы?

Я пробовал с promise.all, но не работает, или с асинхронным ожиданием можно справиться?

1 Ответ

0 голосов
/ 25 июня 2018

Требуется, чтобы обещание, возвращаемое createSchema, разрешалось только после разрешения всех остальных обещаний. map каждый client до Promise и затем вызовите Promise.all на нем. Вам также необходимо сопоставить каждый currentItem с Promise и вызвать Promise.all для этого массива Обещаний.

Из-за console.log s это выглядит немного некрасиво:

const createSchema = () => Business.findAll({
  raw: true,
}).then((data) => {
  console.log('1  >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
  const clientPromises = data.map(({ code }) => {
    console.log('2  >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
    return postgresDB.createSchema(code).then(() => {
      console.log('3 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
      return Promise.all(Object.values(postgresDB.models).map(item => {
        console.log('4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
        return item.schema(code).sync()
          .then(() => console.log('5 >>>>>>>>>>>>>>>>>>>>>>>>>>>>'));
      }))
        .then(() => console.log('Postgres schema created'));
    });
  });
  return Promise.all(clientPromises);
}).catch((err) => {
  console.log('Warning:', err.message);
});

Без console.log s выглядит намного чище:

const createSchema = async () => {
  try {
    const data = await Business.findAll({ raw: true });
    const clientPromises = data.map(async ({ code }) => {
      await postgresDB.createSchema(code);
      return Promise.all(Object.values(postgresDB.models).map(item => (
        item.schema(code).sync()
      )));
    });
    return Promise.all(clientPromises);
  } catch (e) {
    console.log('Warning:', e);
  }
};
...