2016-08-22 5 views
1

約束事で作業することは比較的新しいです。今、私はデータベースからいくつかのデータを照会するために以下を実行しています。私は関数が非同期であることを理解しています。したがって、「then」内のすべてがクエリが終了したときにいつか実行され、結果がその関数に渡されます。私が理解できないことは、外部関数にスコープされた変数にアクセスする方法です。nodejs pg-promiseは関数スコープの外に変数を取得します

var db = require('../repositories/db.js'); 
var Response = require('../models/responseModel.js'); 

var dashboard = {}; 

dashboard.getCompany = function (req, res) { 
    var companyId = req.params.companyId.toUpperCase(); 
    var sql = db.getSql('./sql/getCompany.sql'); 

    db.any(sql, { tic: companyId }) 
     .then(function (data) { 
      var r = new Response(true, 'retrieved company', data); 

      // can't do this because companyId is undefined...    
      // console.log(companyId); 

      res.status(200) 
       .json(r); 
     }) 
     .catch(function (err) { 
      var r = new Response(false, err.message); 
      res.send(r); 
     }); 
}; 

が(それは私が...と私の約束ライブラリを初期化してきたものです)PG-約束だけでなく、青い鳥上に読んでいますが、私はかなりそれが届かない:(私はできるようにする必要があります上記の例では、req.paramsではなく内側のクエリで渡されたIDにアクセスするにはどうすればよいですか?

任意の助けをいただければ幸いです。

+0

companyIdは、getCompany関数全体で定義する必要があります。別の問題があるかもしれません。 –

+0

だから、私は実際にそれにアクセスできるはずですか? – dvsoukup

+0

それは約束とは無関係です。 req.paramsをログに記録し、その内容を確認してください。 –

答えて

0

偉大なオプションが使用することですPromise.bind();

ここでは、3つの関数a、b、およびcの例を示します。 CはAとBの戻り値を必要としますが、bは返す値を知る必要はありません(これは工夫されています)。

var Promise = require('bluebird'); 

function a(){ 
    this.p1 = 'hello'; 
} 
function b(){ 
    this.p2 = 'goodbye'; 
} 

function c(){ 
    return this.p1 + this.p2; 
} 

Promise.bind({}) 
    .then(a) 
    .then(b) 
    .then(c) 
    .then((res)=> console.log(res)) 
    .catch(err => console.log(err)); 

これが返されます。

hellogoodbye

あなたが手(Promise.bindするオブジェクト)あなたが好きな任意のオブジェクトをすることができます。したがって、オブジェクトに外部変数を設定すると、thisでアクセスできます。 Bindはそれに渡されたオブジェクトを受け取り、それを約束しているすべての機能に対してthisに割り当てます。

+0

ありがとう!これは私がそれが必要なもののために働くだろう。 – dvsoukup

関連する問題