Как работать с Promise?

414
29 июня 2017, 03:09

Привет. Допустим, что я хочу вывести какой-то блок на странице:

$('.some-element').append(`
Привет, ${data.user_name}. Вы успешно зарегистрировались в системе. Ваш город определён, как ${getCityByCode(data.code)}`
);

Но дело в том, что в функции getTimeByCode() используется асинхронный ajax-запрос, например:

function getCityByCode(param) {
    $.getJSON('/json/cities.json', function(json){
        for(let i = 0; i < json.length; i++)
            if(json[i].code == param)
                return json[i].cityname;
    })
}

А следственно, функция append() не будет ждать, пока выполнится функция getCityByCode(). Для этого нежно использовать Promise. Но как это правильно сделать? Как заставить append() дожидаться выполнения функции?

Answer 1

Все верно, append не будет ждать запроса, более того в вашей конструкции не получится вернуть cityname напрямую, как результат работы функции getCityByCode.

В данном случае можно использовать Promise, необходимо, чтобы функция getCityByCode возвращала объект Promise, в который нужно передавать асинхронную функцию, которая по завершении действия должна вызвать один из аргументов resolve или reject.

Должно получиться как-то так:

function getCityByCode(param) {
    return new Promise(function(resolve, reject) {
        $.getJSON('/json/cities.json', function(json) {
            for (let city of json) {
                if (city.code == param) {
                    resolve(city.cityname);
                }
            }
        })
    });
}
getCityByCode(data.code)
    .then(function(cityName) {
        $('.some-element').append(cityName);
    });
READ ALSO
Изменить caption в fancybox 3

Изменить caption в fancybox 3

Есть фотогалерея на facybox 3Нужно под каждым фото добавить блок, который содержит текст и ссылку

321
Как задать excluded[&#39;disable&#39;] только для textarea где прикручен ckeditor bootstrapvalidator?

Как задать excluded['disable'] только для textarea где прикручен ckeditor bootstrapvalidator?

На форме есть hidden поля, когда использую excluded:[':disabled'] для того чтобы валидировался CKEDITOR, hidden поле не валидируетсяЕсли использовать excluded:[':disabled',...

275