首页 > 解决方案 > 蓝鸟承诺订单问题

问题描述

我正在观看视频来学习MongoDB Express.js VueJS Node.js (MEVN) 堆栈。

我想创建一个种子目录并使用承诺功能

//  const delay = require('delay')
const Promise = require('bluebird') 
const songs = require('./songs.json')
const users = require('./users.json')
const bookmarks = require('./bookmarks.json')
const historys = require('./history.json')

sequelize.sync({ force: true })
  .then( async function () {

    await Promise.all(
        users.map( user => {
            User.create(user)
        })
    ) 
    await Promise.all(
        songs.map( song => {
            Song.create(song)
        })
    )

     //I have to add this line
     //  ---> await delay(1000) 

    await Promise.all(
        bookmarks.map( bookmark => {
            Bookmark.create(bookmark)
        })
    )

    await Promise.all(
        historys.map( history => {
            History.create(history)
        })
    ) 
})

我有四个带种子的表要创建,最后两个表数据必须在前两个表数据之后创建。(它们是外键)

但是每次运行这个文件,都会先创建最后两张表的数据

我可以防止这种情况的唯一方法是在它们之间添加延迟(1000)。

我想知道有没有什么有效的方法可以解决这个问题~

谢谢你。

标签: javascriptnode.jspromisebluebird

解决方案


像这样的竞争条件总是由没有正确链接承诺引起的。

map回调应返回一个承诺:

await Promise.all(
    users.map( user => User.create(user))
);

等等

不返回值map几乎总是一个错误。它可以通过使用array-callback-returnESLint rule来防止。

如果User.create(user)等是具有默认配置的 Bluebird 承诺,则不链接它们也会导致此警告


推荐阅读