异步/等待无法正常工作

时间:2018-06-23 09:04:41

标签: javascript node.js asynchronous callback promise

我的名为 createUser()的函数:

(\y -> (y z) 5))

(5 z)

我的nodejs api:

const createUser = () => {
    return new Promise(async (resolve, reject) => {
        var data = await Home.findAll({ raw: true })
        await data.forEach(async (client) => {
            await postgresDB.createSchema(client.code).then(async () => {
                await Object.keys(postgresDB.models).forEach(async (currentItem) => {
                    await postgresDB.models[currentItem].schema(client.code).sync();
                });
            });
        });
        resolve('Postgres schema created')
    });
} 

我不知道问题出在哪里,我挣扎了三天以上。

我使用的语法正确吗?还是只使用诺言有好处吗?

2 个答案:

答案 0 :(得分:0)

forEach返回undefinedawait不会等待迭代的异步函数。而是map兑现承诺,并使用Promise.all等待所有承诺:

await Promise.all(Object.keys(postgresDB.models).map(async (currentItem) => {
      /*...*/
}));

在异步函数中另外使用new Promise完全没有意义,以下内容:

const createUser = () => {
  return new Promise(async (resolve, reject) => {

实际上可以是:

async function createUser() {
  //...
}

然后最后只return个结果。


您还必须

return User.create(loginDetails) 

以便将其链接到父承诺中。


我该怎么做:

async function createUser() {
  var data = await Home.findAll({ raw: true })
  await Promise.all(data.map(async (client) => {
    await postgresDB.createSchema(client.code)
    await Promise.all(Object.keys(postgresDB.models).map(currentItem => 

         postgresDB.models[currentItem].schema(client.code).sync();
    ));
  }));        
  return 'Postgres schema created';
} 

//------

exports.userSignup = async (req, res) => {
  try {
    await createUser();
    const loginDetails = {  username: 'stackoverflow' };
    const data = await User.create(loginDetails) 
    res.status(200).send(data);
  } catch(err) {
    console.log(err);
    res.status(500).send("")
 }
};

答案 1 :(得分:0)

您不能像这样await forEach-您需要将promise映射到数组,而要使用Promise.all。另外,当您已经从另一个调用中获得Promise时,请勿构造并返回Promise,而只需从另一个调用中返回Promise。

将两个forEach都转换为Promise.all个调用。例如:

const createUser = async () => {
  var data = await Home.findAll({ raw: true });
  const clientPromises = data.map(async ({ code }) => {
    await postgresDB.createSchema(code);
    return Promise.all(postgresDB.models.map((currentItem) => (
      postgresDB.models[currentItem].schema(code).sync()
    )));
  });
  await Promise.all(clientPromises);
  console.log('Postgres schema created');
}