Я получаю Promise {<pending>} в качестве возвращаемого значения, а также вызов в асинхронной области сразу дает мне неопределенное значение - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь вернуть значение из Promise в асинхронной форме и использовать его в другой функции в другом файле, но у меня есть проблема, потому что мое Promise не возвращает никакого значения. Когда я пытаюсь открыть console.log ('website'), он сразу возвращает мне неопределенное значение (похоже, что значение вообще не извлекается из служб API). Я не знаю, что я делаю неправильно, я действительно люблю узнавать об Promises и Async-Await, но каждый раз, когда я пытаюсь работать с ними, я все больше запутываюсь.

const dns = require('dns')
const iplocation = require("iplocation").default;
const emojiFlags = require('emoji-flags');

const getServerIPAddress = async (server) => {
    return new Promise((resolve, reject) => {
        dns.lookup(server, (err, address) => {
            if (err) throw reject(err);
            resolve(address);
        });
    });
};


const getServerLocation = async (server) => {
    const ip = await getServerIPAddress(server)

    iplocation(ip).then((res) => {
        const country = emojiFlags.countryCode(res.countryCode)
        const result = `Location: ${country.emoji} ${country.name}`
        return result
    })
    .catch(err => {
        return `Location: Unknown`
    });
}

(async function() {
    console.log(await getServerLocation('www.google.com'))
})()


module.exports = {
    getServerLocation
}

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Вы явно используете async, поэтому не понятно, почему вы также используете then. Если вы используете then, то вы должны также вернуть обещание, чтобы сохранить цепочку обещаний:

const getServerLocation = async (server) => {
    const ip = await getServerIPAddress(server)

    return iplocation(ip).then((res) => {
        const country = emojiFlags.countryCode(res.countryCode)
        const result = `Location: ${country.emoji} ${country.name}`
        return result
    })
    .catch(err => {
        return `Location: Unknown`
    });
}

В противном случае просто асинхронизируйте это:

const getServerLocation = async (server) => {
    const ip = await getServerIPAddress(server)

    let res = await iplocation(ip);

    const country = emojiFlags.countryCode(res.countryCode)
    const result = `Location: ${country.emoji} ${country.name}`
    return result
}
1 голос
/ 27 мая 2019
const getServerLocation = async (server) => {
    const ip = await getServerIPAddress(server)

   //you need to return
    return iplocation(ip).then((res) => {
        const country = emojiFlags.countryCode(res.countryCode)
        const result = `Location: ${country.emoji} ${country.name}`
        return result
    })
    .catch(err => {
        return `Location: Unknown`
    });
}
...