javascript - 蓝鸟承诺订单问题
问题描述
我正在观看视频来学习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)。
我想知道有没有什么有效的方法可以解决这个问题~
谢谢你。
解决方案
像这样的竞争条件总是由没有正确链接承诺引起的。
map
回调应返回一个承诺:
await Promise.all(
users.map( user => User.create(user))
);
等等
不返回值map
几乎总是一个错误。它可以通过使用array-callback-return
ESLint rule来防止。
如果User.create(user)
等是具有默认配置的 Bluebird 承诺,则不链接它们也会导致此警告。
推荐阅读
- react-native - 错误:捆绑失败:分辨率不明确。无法通过清除缓存解决
- c - C中的最大小数位数
- react-native - 在 React Native 中访问嵌套数组的值
- c# - C#中的MYSQL如何添加到我的使用中
- shell - 为什么我不能将 tail -f 管道传输到我的 shell 脚本中?
- javascript - 无法将角度控制器的数据提取到 HTML 中
- google-bigquery - 使用 BigQuery 时如何阻止恶意查询夸大您的帐单
- docker - IdentityServer4 + Docker:远程证书根据验证程序无效
- ios - 如何在 UISplitViewController 中使 UINavigationBars 透明?
- javascript - 如何使用 react-select-plus 获取突出显示项的值?