gpt4 book ai didi

node.js - Sequelize migration - 按顺序运行一系列查询

转载 作者:行者123 更新时间:2023-12-03 22:28:59 27 4
gpt4 key购买 nike

我有一系列需要按特定顺序运行的查询。我一直在尝试这个:

var queries = []
queries.push('update blah set foo="bar"')
queries.push('update baz set bar="foo"')

for(var i=0; i< queries.length; i++){
Promise.all([
migration.sequelize.query(queries[i]).then(function(result){
console.log(result)
})
])
}
done();

这不像预期的那样工作。有什么建议么?

更新:在回调中使用递归似乎有效
var queries = []
queries.push('update blah set foo="bar"')
queries.push('update baz set bar="foo"')

var index = 0
var execute = function(queries){
if(typeof queries[index] == 'undefined'){
return done()
}
console.log(queries[index])
migration.sequelize.query(queries[index]).then(function(result){
console.log(result)
index += 1
return execute(queries)
})
}
execute(queries)

最佳答案

如果你使用 io.js 并且可以编写生成器,或者使用 Babel 或 TypeScript 进行编译并且可以编写异步函数,这将变得非常容易。

async function runSerialQueries(queries) {
var results = [];
for (var i=0; i<queries.length; i++) {
var query = queries[i];
var result = await migration.sequelize.query(query);
results.push(result);
}
return results;
}

runSerialQueries([
'update blah set foo="bar"',
'update baz set bar="foo"'
]).then(function(results) {
// ...
})

注意: async上面使用的关键字是 JavaScript EcmaScript 2016 的原生特性,不要与完全不同的“异步”npm 模块混淆。

无论如何,此解决方案确保一个查询在前一个查询结束之前不会开始,并且将按照原始数组的顺序进行。它的行为基本上就像它读取的那样。如果您可以编写生成器但不能编写异步函数,则可以使用生成器完成几乎相同的操作,但需要像 co() 这样的库。或 Bluebird.coroutine() .

查看这篇优秀的文章,了解这些技术的背景。它们确实是 JavaScript 的 future :

https://blog.risingstack.com/asynchronous-javascript/ <-- 强烈推荐!

关于node.js - Sequelize migration - 按顺序运行一系列查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32279889/

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