2017-09-25 61 views
2

我的節點服務器需要與其他服務器連接以獲取一些信息並將其發送給用戶。由於在這種情況下請求是異步的,我通常使用附加庫,如request-promise。但是在這裏我有很多來自多個點的呼叫,所以我創建了一個函數來處理它們,這個解決方案不起作用。節點js使用來自其他功能的請求的承諾

apiCall1: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 
apiCall2: function(req,res){ 
    var info = fetchFromOtherServer(); 
    console.log(info); // undefined 
    res.send(info) 
} 

function fetchFromOtherServer(){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
    if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     return body; 
    } 
    } 
} 

首先,我得到一個API調用的功能apiCall()調用該函數fetchFromOtherServer。但是在請求完成之前,node標記info變量爲undefined並將其發送給用戶。如何更改我的代碼以告訴節點等待,直到我從其他服務器收到響應爲止?

回答

0

你需要一個你自己的承諾,你會希望使用你的承諾處理程序。 看看promise documention 及其示例。

apiCall1:

function(req,res){ var info_promise = fetchFromOtherServer(); 
    info_promise.then(function(info) { 
    console.log(info); // undefined 
    res.send(info) 
    }); 
    # Also look into catch on promises for error 
} 

function fetchFromOtherServer(){ 
    return new promise(function(resolve, fail){ 
    var options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    request(options, function(err,response,body){ 
     if(!err && response.statusCode == 200){ 
     console.log(body) // here is a body from other server 
     resolve(body); 
     } 
    } 
    }); 
} 
0

如果使用ES6asyncawait。它會大大簡化您的代碼。

apiCall1: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 
apiCall2: function(req,res){ 
    let response = await fetchFromOtherServer(); 
    // do something with response 
} 

async function fetchFromOtherServer(){ 
    let options = {"method":"POST", "headers":{...},"uri":"{...}"} 
    let response = await request(options); 
    return response; 
} 
+0

現在終端發送給我一個錯誤「await」短語。我如何將ES6包含到我的節點項目中?在package.json中做些什麼? – ampher911

+0

如果您不使用'babel'或'typescript',那麼您需要'節點7.x'來支持本地'async'。 – nilobarp