2017-02-03 58 views
0

我有一個返回類型函數:如何通過node.js中的async同步功能?

var responseData = ''; 
function getResponseFromKey(key){ 

    client.get(key, function(err, reply){ 
     responseData = reply; 
    }); 
    return responseData; 
} 

當我調用這個函數第一次返回空白,然後第二次返回我的價值,我重新運行後想。

我打電話給這個函數在html頁面打印。

http.createServer(function(request, response){ 
    response.writeHead(200, {'Content-Type':'text/plain'}); 
    getResponseFromKey("my_key"); 
    console.log(responseData); 
}).listen(8083); 

正如我熟悉的節點功能是異步的方式。你能幫我做同步嗎?在這種情況下,我需要使用generators嗎?

幫助,將不勝感激!

+3

您可以使用'callbacks','promises'或'generators'。 – ThomasThiebaud

+1

可能的重複[如何返回來自異步調用的響應?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

+0

您應該使用promise js。 –

回答

0

你的client.get函數是異步嘗試returing return responseData;在client.get體內

var responseData = ''; 
function getResponseFromKey(key ,cb){ 

client.get(key, function(err, reply){ 
    responseData = reply; 
    return cb(responseData); 
}); 

} 

http.createServer(function(request, response){ 
response.writeHead(200, {'Content-Type':'text/plain'}); 
getResponseFromKey("my_key", function(responseData) { 
    console.log(responseData); 
}); 
}).listen(8083); 
+0

我在運行代碼時遇到這個錯誤'TypeError:cb不是函數' –

+0

您是否寫過這個正確的getResponseFromKey(「my_key」,function(responseData){ console.log(responseData); }); –

+0

回調是函數調用中的第二個參數。 –

1

您可以使用callbackpromisegenerator

使用回調,你需要發送一個回調函數,並調用它,而不是返回值

function getResponseFromKey(key, callback){ 
    client.get(key, function(err, reply){ 
    callback(reply); 
    }); 
} 

http.createServer(function(request, response){ 
    response.writeHead(200, {'Content-Type':'text/plain'}); 
    getResponseFromKey("my_key", function() { 
    console.log(responseData); 
    }); 
}).listen(8083); 

使用的承諾,你需要返回一個承諾

function getResponseFromKey(key) { 
    return new Promise(function(resolve, reject) { 
    client.get(key, function(err, reply) { 
     return resolve(reply); 
    }); 
    }) 
} 

http.createServer(function(request, response){ 
    response.writeHead(200, {'Content-Type':'text/plain'}); 
    getResponseFromKey("my_key").then(function(responseData) { 
    console.log(responseData); 
    }); 
}).listen(8083); 

如果您正在使用和最新版本的nodejs,您可以使用箭頭函數,使您的代碼更具可讀性。