将功能传递给Promise ES6

时间:2017-01-26 13:28:28

标签: javascript function es6-promise

我已经以各种形式看到了类似的问题,但我似乎无法解决这个特殊情况......

我想在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 => {}函数作为回调传递?

1 个答案:

答案 0 :(得分:1)

这里的问题是你创造了永远无法解决的承诺。它们内部有一个永远不会被调用的函数,resolvereject挂起了该函数。

所以修复你的第二块代码来返回函数,而不是承诺:

(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())
);