Сделать асинхронный код, чтобы работать как синхронный - Javascript - PullRequest
0 голосов
/ 07 июня 2018

Я использую nodejs

Это моя функция с именем createSchema:

const createSchema = () => {
  Business.findAll({
    raw: true,
  }).then((data) => {
    data.forEach((client) => {
      postgresDB.createSchema(client.code).then(() => {
        Object.keys(postgresDB.models).forEach((currentItem) => {
          postgresDB.models[currentItem].schema(client.code).sync();
        });
        console.log('Postgres schema created');
      }).catch(() => {
      });
    });
  }).catch((err) => {
    console.log('Warning:', err.message);
  });
};
createSchema();

Я вызываю эту функцию внутри этой пост-функции

exports.createBusiness = (req, res) => {
  const business = {
    name: req.body.name,
    code: req.body.code,
    email: req.body.email,
  };
  Business.create(business)
    .then((rawbusinessData) => {
      createSchema()     // this is the function
        .then(() => { .  // i want to complete createSchema fully then only i want to execute this below stuffs
          const businessData = rawbusinessData.get({ plain: true });
          const loginDetails = {
            username: 'sameer',
            password: encrypt('sameer'),
          };
          const schemaLogin = postgresDB.models.login.schema(businessData.code);
          schemaLogin.create(loginDetails).then((loginData) => {
            console.log('loginData:', loginData);
          });
          res.status(200).send(businessData);
        });
    })
    .catch((err) => {
      console.log('err:', err);
    });
};

Явызов первой функции внутри моей второй пост-функции с именем createBusiness ,

Я хочу полностью завершить функцию createSchema, тогда только мне нужно выполнить другой затем метод ()во второй функции под названием createBusiness

См. мой код, я сделал комментарий, который должен работать в первую очередь,

Я пытался с асинхронным ожиданием, но не работает!

Ответы [ 2 ]

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

Вы пропускаете возвращение Promise во многих местах.Вам нужно вернуть все из них:

// No "block" implies return
const createSchema = () =>
  Business.findAll({ raw: true})
    .then((data) => 
      // wrap Promise.all and map() instead of forEach()
      Promise.all(
        data.map((client) =>
          postgresDB.createSchema(client.code).then(() => 
            // Again wrap Promise.all and map()
            Promise.all(
              Object.keys(postgresDB.models).map((currentItem) => 
                postgresDB.models[currentItem].schema(client.code).sync()
              )
            )
          )
        )
      )
    )
    .then(() => console.log("now I'm done"))
    //.catch((err) => console.log('Warning:', err.message));

Таким образом, в основном обтекание Promise.all и использование Array.map() для фактического возврата обещаний, когда вы выполняете итерацию

Другое дело - не злоупотреблять блоками {}.Просто вернитесь к функции стрелки, когда у вас все равно есть только одна вещь.При желании сбросьте .catch() и просто разрешите выбрасывать ошибки из этой функции.После отладки вы фактически «должны» удалить эту строку и допустить выдачу ошибок.

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

В идеале, тур код должен работать.Возможно, проблема связана с тем, что функция createSchema() не возвращает обещание.

     const createSchema = () => {
      Business.findAll({
        raw: true,
      }).then((data) => {
        data.forEach((client,index) => {

          postgresDB.createSchema(client.code).then(() => {
            Object.keys(postgresDB.models).forEach((currentItem) => {
              postgresDB.models[currentItem].schema(client.code).sync();
               if(index==data.length-1)
                return true;
            });
            console.log('Postgres schema created');
          }).catch(() => {
          });
        });
      }).catch((err) => {
        console.log('Warning:', err.message);
      });
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...