Javascript 如何将此函数转换为异步等待函数?
使用:MongoDB、Express、Mongoose、NodeJs 我目前有一个seedDB函数,它需要一个月数组,并为一个“月”集合设置种子。这看起来是这样的:Javascript 如何将此函数转换为异步等待函数?,javascript,node.js,mongodb,mongoose,async-await,Javascript,Node.js,Mongodb,Mongoose,Async Await,使用:MongoDB、Express、Mongoose、NodeJs 我目前有一个seedDB函数,它需要一个月数组,并为一个“月”集合设置种子。这看起来是这样的: const monthData = [{ month: 'January', shifts: [] }, { month: 'February', shifts: [] }, { month: 'March',
const monthData = [{
month: 'January',
shifts: []
},
{
month: 'February',
shifts: []
},
{
month: 'March',
shifts: []
},
{
month: 'April',
shifts: []
},
{
month: 'May',
shifts: []
},
{
month: 'June',
shifts: []
},
{
month: 'July',
shifts: []
},
{
month: 'August',
shifts: []
},
{
month: 'September',
shifts: []
},
{
month: 'October',
shifts: []
},
{
month: 'November',
shifts: []
},
{
month: 'December',
shifts: []
}
];
function seedDB() {
for (entry of monthData) {
Month.create(entry, (err, created) => {
if (err) console.log(err);
else console.log(created);
})
}
}
问题是,我需要按顺序播种月份(使用此方法并不总是如此),因此我觉得异步函数可能在这里工作,这告诉它只需在上一个月播种后提前创建下一个月
我看过无数关于promises和async Wait的教程,但我仍然不完全理解如何应用逻辑。如果有人能展示并解释我当前代码的异步/承诺替代方案,我将不胜感激。两个补充。
seedDB
函数前面的async
关键字,以及每个承诺前面的wait
关键字:
async function seedDB() {
for (entry of monthData) {
await Month.create(entry, (err, created) => {
if (err) console.log(err);
else console.log(created);
})
}
}
for
循环现在将不会继续,直到每个承诺都得到解决
EDIT:由于Month.create()
可能不返回承诺(它看起来像传统的错误/值回调,您可能需要手动将其包装在承诺中,如下所示:
async function seedDB() {
for (entry of monthData) {
await new Promise((resolvePromise, rejectPromise) =>
Month.create(entry, (err, created) => {
if (err) {
rejectPromise();
console.log(err);
} else {
resolvePromise();
console.log(created);
}
})
});
}
}
或者,如果您使用的是Node,则可以利用它,它接受回调风格的函数并返回一个提供常规承诺的函数
const util = require('util');
const createMonthPromise = util.promisify(Month.create);
async function seedDB() {
for (entry of monthData) {
const created = await createMonthPromise(entry);
console.log('Created!', created);
}
}
:
await表达式导致异步函数执行暂停,直到一个承诺得到解决(即,履行或拒绝),并在履行后恢复异步函数的执行。恢复时,await表达式的值为履行承诺的值
您可以使用“蓝鸟”库中的Promise.mapSeries 在本文中,您可以看到示例和解释 但我不建议您使用顺序依赖关系将记录存储在db中。请查看您的架构和用例,也许您可以避免它。也许您可以使用“创建”回调来确保以这种方式创建上一个条目:
let i=0;
let callback = ()=> {if (i< monthData.length){ seedDB(i); console.log(i, "seeded"); i++;} }
function seedDB(index){
Month.create(monthData[index], callback)
}
设i=0;
让callback=()=>{if(i
Thankyu,看起来正是我想要的,但似乎没有什么区别…?月份仍在以任何顺序输入,非常有效,谢谢!只要看到那块代码,它就会点击!
let i=0;
let callback = ()=> {if (i< monthData.length){ seedDB(i); console.log(i, "seeded"); i++;} }
function seedDB(index){
Month.create(monthData[index], callback)
}