2017-01-26 15 views
-2

私は様々な形で次のような質問を見てきましたが、私はこの特定のケースをクラックすることができないようにそして、私は約束の内部で機能を渡したい...約束ES6

を関数を渡しますその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

? – JLRishe

+0

'_.reduce'とは何ですか?アンダースコアからですか? – slebetman

+2

あなたの用語では混乱します。 「約束を実行する」とはどういう意味ですか? 「約束の中で機能を渡す」とはどういう意味ですか?あなたは "明白な約束のコンストラクタの反パターン"を使用していることを認識していますが、これはおそらくあなたの問題に直接関係していませんか?あなたの約束のコンストラクタから関数を返すことは何もしません。 –

答えて

1

ここでの問題は、決して解決されない約束事を作り出していることです。彼らは決して呼び出されないそれらの内部の機能を持っていて、resolverejectはその機能から離れています。

(newVals, id, fkId) => 
    txn => 
     db.table('Users') 
      .insert(newVals) 
      .transacting(txn) 
      .then(res => res.id) 

は、それに応じて、コードの最初のチャンクを修正:

そうな機能ではなく、約束を返すために、コードの2番目のチャンクを修正

動作していないことの一部
db.transaction(txn => 
    _.reduce(functions, (pending, next, i) => 
     next(txn) 
      .then(newIds => { 
       if (newIds) { 
        returnContent[i] = newIds 
       } 
      }) 
    , Promise.resolve()) 
); 
+0

'トランザクション 'コールバックはその約束を'返す 'べきだと思います。 – Bergi

+0

@Bergi良い点は固定ですが、DB API OP使っています。 – JLRishe

+0

いいね!うん、私は自分自身を1つの約束で全機能を解決しようとすることに混乱させました。もちろんデータベース機能を返すことができます。 – MDalt

関連する問題