вернуть значение из $ .get - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно создать функцию, которая возвращает мне код страны посетителя, например:

function getIsoCodeFromIp() {
    try {
        var response = await $.get("http://ip-api.com/json", null, "jsonp");
        return response.countryCode;
    } catch (error) {
        return null;
    }
}

как мне вернуть этот ответ?

У меня есть JSON, Мне нужно вывести двухбуквенную строку, не больше и не меньше, но кажется, что при таком асинхронном подходе очень сложно делать такие простые вещи.

Мне не нужно регистрировать это на консоли, я нужно ВОЗВРАТИТЬ это.

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Вы можете использовать await только в функции async.

// placed `async` before function
async function getIsoCodeFromIp() {
    try {
        var response = await $.get("http://ip-api.com/json", null, "jsonp");
        return response.countryCode;
    } catch (error) {
        return null;
    }
}

// async function returns Promise, use then(callback)
getIsoCodeFromIp().then(function(result){
    console.log(result); //here
});

Теперь он возвращает Promise , потому что это асин c функция. Вам нужно отловить ответ с помощью функции then().

0 голосов
/ 31 марта 2020

Наконец, это можно возобновить в такой функции, как эта

fetch('http://ip-api.com/json')
    .then((r) => r.json())
    .then((d) => console.log(d.countryCode));

Конечно, вопрос был о том, как вернуть строку, а не просто записать ответ.

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

Например. Вы можете связывать звонки, чтобы получить желаемый результат. Скажем, вам нужно получить код страны ISO3 из кода страны ISO2 первого звонка. Чтобы использовать второй API для кода страны ISO3, вам может потребоваться сделать следующее:

fetch('http://ip-api.com/json')
        .then((j1)=>j1.json())                           // get iso2 country code
    .then((iso2)=>fetch('http://country.io/iso3.json')
        .then((j2)=>j2.json())                           // get iso3 code  
    .then((iso3)=>console.log(iso3[iso2.countryCode]))); // combine 1st result & 2nd
...