首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使异步代码像同步Javascript一样工作。

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

Stack Overflow用户
提问于 2018-06-07 09:50:45
回答 2查看 99关注 0票数 1

我正在使用nodejs

这是我的函数createSchema:

代码语言:javascript
运行
复制
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();

我正在调用这个函数,在这个post函数中

代码语言:javascript
运行
复制
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);
    });
};

我在第二个post函数createBusiness,中调用第一个函数

我想完整地完成createSchema函数,然后只需要在我的第二个函数createSchema中执行其他的然后方法()

看到我的代码,我做了一个需要首先工作的评论,

我尝试了异步等待,但没有工作!

EN

回答 2

Stack Overflow用户

发布于 2018-06-07 10:13:31

你错过了很多地方的回报承诺。你得把它们都还给我:

代码语言:javascript
运行
复制
// 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(),只允许抛出此函数中的错误。调试之后,您实际上“应该”删除该行并允许抛出错误。

票数 2
EN

Stack Overflow用户

发布于 2018-06-07 09:56:07

理想情况下,旅游代码应该可以工作。问题的发生可能是因为createSchema()函数没有返回承诺。

代码语言:javascript
运行
复制
     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);
      });
    };
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50738207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档