Как только Обещание выполнено, почему console.log является единственным выходным примером? - PullRequest
0 голосов
/ 29 июня 2019

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

Я не совсем понимаю заумные ответы на выполнение Обещаний.

Я пытаюсь понять, как развернуть мои данные из возвращенного Обещания.console.log(data) не отвечает на вопрос.«Как получить полезную нагрузку?».

Почему это кровавый секрет?

Я использовал нод REPL для отслеживания своего кодирования.Я делаю все правильно, кроме последнего шага, и здесь я бью в темноте.

someasyncFunction()
.then(data => data);

должен вернуть «развернутую» полезную нагрузку, верно?Итак, почему я получаю

$ node gettest.js 
Promise { <pending> }

Есть техническая часть, которую я пропускаю, и я не могу помочь, отвечая на эту последнюю часть.

const https = require('https');
const datastore = {};

async function getInfo (){
        https.get('https://www.gnu.org/software/bash/manual/html_node/Command-Line-Editing.html#Command-Line-Editing', (resp) => {
        let data='';

        resp.on('data', (chunk) => {
            data += chunk;
        });

        resp.on('end', () => {
            //console.log(data);
            return data;
                        });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
        });
}

datastore.info = getInfo().then(function (val){
    return val;
});

console.log(datastore.info);

1 Ответ

0 голосов
/ 29 июня 2019

getInfo - это обещание, также метод then возвращает само обещание.

Вы присваиваете свою переменную Promise, поэтому, очевидно, вы получите ссылку на нее.

Как сказал вопрос, который вы связали, вы должны принять асинхронную природу JavaScript, и ваш поток просто синхронен сверху вниз. Это просто асинхронно внутри функции getInfo, но этого недостаточно, потому что поток остается синхронным.

Я советую вам, просто чтобы понять, что вы делаете, чтобы не использовать async / await, поскольку это позволяет вам думать, что все синхронно, а это не так.

Так что используйте значение val только внутри функции then:

getInfo().then(function (val){
    // Your async code here
});

Если вы уверены в этом способе мышления, вы можете реорганизовать его, используя async / await , который является почти синтаксическим сахаром для получения лучшего кода:

(async function () {
  async function getInfo () {
    // your code
  }

  datastore.info = await getInfo();

  console.log(datastore.info);

})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...