使异步代码像同步一样工作 - Javascript

时间:2018-06-07 09:50:45

标签: javascript node.js asynchronous promise

我正在使用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 :(得分:2)

你错过了很多地方的回复承诺。你需要归还所有这些:

{}

所以主要包装Promise.all并使用Array.map()实际返回你正在迭代的承诺

另一件事是不要过度使用块.catch()。只需返回箭头功能,无论如何只有一个东西。 (可选)删除onDestroy()并允许此函数的错误抛出。在调试之后,你实际上应该"应该"删除该行并允许抛出错误。

答案 1 :(得分:0)

理想情况下,旅游代码应该有效。发生的问题可能是因为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);
      });
    };