我有复杂的解决方案,我只需要同步运行knex,是否可能?
我有knex
查询在Promise.mapSeries
内为具有未知元素数的数组运行的情况。对于每个元素,调用一些knex query
,包括insert
查询。
因此,此插入可能会影响数组的下一个元素的结果。
var descriptionSplitByCommas = desc.split(",");
Promise.mapSeries(descriptionSplitByCommas, function (name) {
// knex.select
// knex.insert if select doesn't return results
});
这不是我的初始代码,所以甚至可能会删除Promise.mapSeries。但我需要同步处理每个descriptionSplitByCommas
数组元素。
否则经常在处理数组中的下一个描述时遇到SQL错误,因为为具有唯一索引的列插入了重复元素。如果查询是同步的,则不会发生这种情况。
答案 0 :(得分:0)
我使用本机承诺,因此我没有使用mapSeries的经验,因此我无法告诉您当前状态到底发生了什么。
然而,串行而不是并行运行多个异步命令是很常见的。有一件重要的事情,你必须知道 - 一旦你创造了Promise,你就无法控制如何以及何时解决它。因此,如果您创建100个Promises,它们都会开始并行解析。 这就是原因,没有像Promise.series这样的原生承诺的方法 - 这是不可能的。
你有什么选择?如果您需要在一个地方创建承诺,但在另一个地方运行它,那么工厂方法就是您的朋友:
const runPromiseLater = () => Promise.resolve(25);
// some code
const myRealPromise = runPromiseLater();
myRealPromise.then( //
当然,您可以使用这些方法创建数组,然后是问题 - 如何连续运行它?
如果您可以使用支持async / await的Node,那么循环就足够了
async function runInSeries(array) {
for (let i=0;i < array.length; i++){
await array[i]();
// or if you have only instructions in array then you get the value and then call some // await myMethod(array[i])
}
}
如果你不能使用它,那么异步库就是你的朋友:https://caolan.github.io/async/docs.html#series
如果您需要使用之前通话中的值,则可以使用.waterfall