сделать nodejs http получить звонок синхронно - PullRequest
0 голосов
/ 28 января 2020

Мне задали вопрос в интервью. ниже вопрос.

const JsonFromHTTPCall = function(){

    // make get request to some api url and return json object.
}



// code below is not editable

let result = JsonFromHTTPCall();
console.log("result ", result);

Я не нахожу способ заставить оператор console.log ждать, пока я не получу результат от http-вызова.

Пожалуйста, дайте мне способ решить это. Заранее спасибо.

1 Ответ

1 голос
/ 28 января 2020

Nodejs не предлагает синхронную сеть в любом случае. Все встроенные сети работают асинхронно. Следовательно, вы не можете напрямую возвращать значение из функции, полученной через сеть. Вместо этого вам необходимо сообщить результат либо с помощью функции обратного вызова, инициируемого вами события, либо возвращенного обещания.

Краткое описание этой проблемы см. В этом очень активном вопросе / ответе:

Как я могу вернуть ответ от асинхронного вызова?

Существует грубый хак, который включает использование синхронного дочернего процесса и его выполнение для вас, но вряд ли это то, что они спрашивали в вашем интервью.

Итак, основной ответ на вопрос заключается в том, что «nodejs не предлагает синхронную сеть», и далее «вы не можете изменить асинхронный результат в синхронный результат». Таким образом, правильный способ кодирования это использование nodejs методов асинхронного кодирования.

Самый чистый способ, которым я знаю, чтобы делать вызовы http, использует библиотеку, такую ​​как request-promise() или мой новый любимый got() и используйте интерфейс обещаний плюс async/await, чтобы создать хороший чистый путь к коду:

const got = require('got');

async function getSomeJSON(url) {
    let data = await got(url).json();
    console.log(data);
    return data;
}

getSomeJSON(myURL).then(data => {
    console.log("got my data");
}).catch(err => {
    console.log(err);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...