我的名为 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')
});
}
我不知道问题出在哪里,我挣扎了三天以上。
我使用的语法正确吗?还是只使用诺言有好处吗?
答案 0 :(得分:0)
forEach
返回undefined
,await
不会等待迭代的异步函数。而是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');
}