Javascript 如何将此函数转换为异步等待函数?

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',

使用:MongoDB、Express、Mongoose、NodeJs

我目前有一个seedDB函数,它需要一个月数组,并为一个“月”集合设置种子。这看起来是这样的:

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)    
}