Получить PromiseValue из возвращенного обещания - PullRequest
0 голосов
/ 05 апреля 2019

Я искал StackOverflow и читал разделы о получении значений из возвращенных обещаний, но по некоторым причинам эти примеры не работают для меня.

Мой код:

const getThatZip = (zip) => new Promise((resolve, reject) => {
    const query = `http://api.zippopotam.us/us/${zip}`;
    const request = new XMLHttpRequest();
    request.addEventListener('readystatechange', (e) => {
        if (e.target.readyState === 4 && e.target.status === 200) {
            const data = JSON.parse(e.target.responseText);
            //console.log(data.places[0]['place name'] + ', ' + data.places[0]['state abbreviation']);
        resolve(data.places[0]['place name'] + ', ' + data.places[0]['state abbreviation'])
        } else if (e.target.readyState === 4) {
            reject('An error has occurred')
        }
    });
    request.open('GET', query);
    request.send();
});

const handleZipBtn = () => {
    const zipVal = zipLine.value;
    const theAnswer = getThatZip(zipVal).then((result) => {
        return result
    });
    console.log(theAnswer);
};

Консоль.log внутри обещания дает хорошие данные.Но вызов getThatZip только дает мне обещание.Может кто-нибудь указать на мою ошибку?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

попробуйте

const handleZipBtn = async () => {
    const zipVal = zipLine.value;
    const theAnswer = await getThatZip(zipVal)
    console.log(theAnswer);
};
2 голосов
/ 05 апреля 2019

Поскольку JS является асинхронным, строка с console.log(theAnswer); выполняется до разрешения обещания. Вы можете решить эту проблему, используя синтаксис es6 async/await, или сделать запись в консоли в блоке then(), чтобы увидеть, когда для переменной задано разрешенное обещание.

const handleZipBtn6 = () => { 
    const zipVal = zipLine.value; 
    const theAnswer = getThatZip6(zipVal).then(res => { 
        console.log({ promiseIsResolved: res }) 
    }); 
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...