gpt4 book ai didi

javascript - 如何将异步代码变成同步代码-nodejs?

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:07 26 4
gpt4 key购买 nike

这是我的nodejs api代码:

exports.createBusiness = (req, res) => {
const business = { name: req.body.name };
Business.create(business)
.then(() => {
createSchema() // this function, i pasted below

.then(() => {
console.log('6 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
});
})
.catch((err) => {
console.log('err:', err);
});
};

我的功能:

const createSchema = () => Business.findAll({
raw: true,
}).then((data) => {
console.log('1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

data.forEach((client) => {
console.log('2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

postgresDB.createSchema(client.code).then(() => {
console.log('3 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

Object.keys(postgresDB.models).forEach((currentItem) => {
console.log('4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');

postgresDB.models[currentItem].schema(client.code).sync();
console.log('5 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
});

console.log('Postgres schema created');
});
});
}).catch((err) => {
console.log('Warning:', err.message);
});

我的输出现在按以下顺序出现在控制台中:

1  
2
2
2
2
2
2
2
2
2
6



3
4
5

我的预期输出在控制台中:(我需要同步执行):

1  
2
2
2
2
2
2
2
2
2

3
4
5

6

如何使用 promise 或回调使其同步运行?

我尝试使用promise.all但不起作用,或者async wait是否很好处理?

最佳答案

只有在所有其他 promise 都得到解决后,您才需要解决由 createSchema 返回的 promise 。将每个客户端映射到一个Promise,然后对其调用Promise.all。您还需要将每个 currentItem 映射到 Promise 并对该 Promise 数组调用 Promise.all

由于 console.log 的原因,它看起来有点难看:

const createSchema = () => Business.findAll({
raw: true,
}).then((data) => {
console.log('1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
const clientPromises = data.map(({ code }) => {
console.log('2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
return postgresDB.createSchema(code).then(() => {
console.log('3 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
return Promise.all(Object.values(postgresDB.models).map(item => {
console.log('4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>');
return item.schema(code).sync()
.then(() => console.log('5 >>>>>>>>>>>>>>>>>>>>>>>>>>>>'));
}))
.then(() => console.log('Postgres schema created'));
});
});
return Promise.all(clientPromises);
}).catch((err) => {
console.log('Warning:', err.message);
});

没有console.log,它看起来干净多了:

const createSchema = async () => {
try {
const data = await Business.findAll({ raw: true });
const clientPromises = data.map(async ({ code }) => {
await postgresDB.createSchema(code);
return Promise.all(Object.values(postgresDB.models).map(item => (
item.schema(code).sync()
)));
});
return Promise.all(clientPromises);
} catch (e) {
console.log('Warning:', e);
}
};

关于javascript - 如何将异步代码变成同步代码-nodejs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51021257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com