2016-08-22 84 views
1

相對較新的與承諾的工作。現在,我運行以下命令來查詢數據庫中的一些數據。我明白這個函數是異步的,因此在查詢結束之後的某個時候,「then」中的所有內容都會被執行,並將結果傳遞給該函數。我不明白的是如何訪問變量作用域的外部函數,以便我可以使用它們?的NodeJS PG-承諾得到變量之外的功能範圍

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訪問。綁定將物品交給它,並將其分配給this,以獲得承諾鏈接的所有功能。

+0

謝謝!這將適用於我需要它做的事情。 – dvsoukup