2017-03-27 30 views
0

我得到了回調的異步性質。我只是尋找一種模式,將返回值呈現給console.log("1", ret);.on()監聽器中的Node.js回調的返回值

還是有一個更好的方法?

這是在.on()中的回調正在拋棄我。

var _Con = require('tedious').Connection; 
var _Req = require('tedious').Request; 
function OnConnect_CanIConnectToTheDB(err) { 
    if (err) 
     return "err, could not connect to db"; 
    else 
     return "connected to db// "; 
} 


function CanIConnectToTheDB() { 

    var ret = "err"; 
    var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' }) 
     .on('connect', function (err) { 
      ret = OnConnect_CanIConnectToTheDB(err); 
      console.log(ret); 
     }); 
    console.log("1", ret); 
    return ret; 
} 

router.get('/', function (req, res) { 
    res.send(CanIConnectToTheDB()); 
}); 
+1

「我得到回調的異步性質」 - 不,你不知道。 – Quentin

+2

也許不在你的深度。 – Steve

+0

對於所有的異步函數,只有兩件事情是真的。 (1)他們不會立即致電。 (2)由於1,您不能將結果返回到啓動異步過程的函數。沒有很多深度。 – Quentin

回答

1

這不會有任何效果:

function CanIConnectToTheDB() { 

    var ret = "err"; 
    var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' }) 
     .on('connect', function (err) { 
      ret = OnConnect_CanIConnectToTheDB(err); 
      console.log(ret); 
     }); 
    console.log("1", ret); 
    return ret; 
} 

那是因爲你在ret獲得前值return ret;運行。所有你可以返回是一個承諾,是這樣的:

function CanIConnectToTheDB() { 

    return new Promise((resolve, reject) => { 
     var ret; 
     var con = new _Con({ userName: 'bla', password: 'bla', server: 'bla' }) 
     .on('connect', function (err) { 
      ret = OnConnect_CanIConnectToTheDB(err); 
      console.log(ret); 
      resolve(ret); 
     }); 
    }); 
} 

this answer for more details也看到:

請記住,當你的函數返回一個承諾,那麼你必須像這樣使用它:

CanIConnectToTheDB().then(result => { 
    // you have result here 
}).catch(error => { 
    // you have error here 
}); 

或:

CanIConnectToTheDB().then(result => { 
    // you have result here 
}, error => { 
    // you have error here 
}); 

或 - 只有當你是一個函數內有async關鍵字:

try { 
    let result = await CanIConnectToTheDB(); 
    // you have result here 
} catch (error) { 
    // you have error here 
} 

注 - 裏面你CanIConnectToTheDB()你應該使用resolve(value)解決的承諾,並rejest(error)到拒絕它。

欲瞭解更多信息,請參閱:

文檔:

+0

您提供了異常值。感謝您提供完善的答案。我知道我不得不錯過一些更好的方法。我不使用節點。一天一天,一天一天。也沒有JavaScript。所以我沒有考慮承諾。但現在我發現它總是有意義的。 – Steve

+1

這會造成更大的上下文問題IMO。連接測試後,我想實際查詢並跳轉,但從未保證,請取回一行或多行。哪裏是最適用的地方來調用一個方法來執行查詢?在router.get()中,但沒有連接。在.on('connect')?那麼,我該如何回覆承諾,或者如何回覆行而不影響承諾?在OnConnect_CanIConnectToTheDB()?在實施你所展示的內容之後,你會怎樣查詢數據庫?一個獨立的方法創建它自己的連接?第二個連接不能保證。謝謝。 – Steve

+1

我要在.on('connect')中嵌套一個新的'rows'Promise,這樣我就可以將結果/ s或缺少的行追加到連接Promise的返回值的返回值中。 – Steve