2017-02-03 4 views
0

Я функцию возврата типа:Как сделать функцию синхронизации от async в node.js?

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-return-the-response-from-an-asynchronous-call) –

+0

Вы должны использовать обещание js. –

ответ

0

Функция client.get async пытается сохранить возвращаемый ответData; внутри тела 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

Вы написали это correcty getResponseFromKey (« my_key », function (responseData) { console.log (responseData); }); –

+0

callback - второй параметр в вызове функции. –

1

Вы можете использовать callback, promise или generator.

Использование обратного вызова, вам необходимо отправить функцию обратного вызова и вызовите его вместо возвращения значения

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, вы можете использовать функции стрелок, чтобы сделать ваш код более читаемым.

0

Во многих случаях обратный вызов не является хорошим выбором.

Вы можете использовать async, promises, generators и async functions which supported in es7.

Я рекомендую promises beacuse promise Ключевые особенности ES6.

Я думаю, что эта статья вам поможет.

https://blog.risingstack.com/node-js-async-best-practices-avoiding-callback-hell-node-js-at-scale/