我已经以各种形式看到了类似的问题,但我似乎无法解决这个特殊情况......
我想在Promise中传递一个函数,然后执行该Promise并对结果做一些事情。要传入的函数是下面的数据库事务txn
函数:
db.transaction(txn => {
//lodash reduce function to execute each promise sequentially
_.reduce(promisesToExecute, (pending, next, i) => {
return next
//this bit is wrong but I don't know how else to pass in txn
//how should I pass txn into the promise?
.then(fn => fn(txn))
.then(newIds => {
if (newIds) {
returnContent[i] = newIds
}
return next
})
}, Promise.resolve())
})
我想要执行的承诺就在这里
(newVals, id, fkId) => {
return new Promise((resolve, reject) => {
return txn => {
//I want txn to be available in here to use
return db.table('Users')
.insert(newVals)
.transacting(txn)
.then(res => {
resolve(res.id)
})
.catch(err => {
reject(err)
})
}
})
有什么想法吗?我是否需要以某种方式将newIds => {}
函数作为回调传递?
答案 0 :(得分:1)
这里的问题是你创造了永远无法解决的承诺。它们内部有一个永远不会被调用的函数,resolve
和reject
挂起了该函数。
所以修复你的第二块代码来返回函数,而不是承诺:
(newVals, id, fkId) =>
txn =>
db.table('Users')
.insert(newVals)
.transacting(txn)
.then(res => res.id)
然后相应地修复第一块代码:
db.transaction(txn =>
_.reduce(functions, (pending, next, i) =>
next(txn)
.then(newIds => {
if (newIds) {
returnContent[i] = newIds
}
})
, Promise.resolve())
);