• Вывод результатов цепочки промисов работает странно, почему?

    0xD34F
    @0xD34F Куратор тега JavaScript
    промисы же сами по себе асинхронны

    Это ваша принципиальная ошибка. Не асинхронны они. Promise исполняет переданную ему функцию немедленно. Вот внутри переданной функции можно делать что-то асинхронное.

    А можно не делать - как у вас в первом случае. Получается так - промис создаётся, тут же происходит resolve, дальше в цикле создаётся следующий промис, который в свою очередь тоже немедленно резолвится и так далее. В результате у браузера нет возможности обновить DOM, так как поток выполнения занят. Обновление происходит только после того, как цикл завершится.

    Во втором же случае вызовы setTimeout прерывают исполнение вашего кода, давая браузеру возможность обновить DOM. "Даже с 0 задержкой" - тоже ничего удивительного, так как нулевая задержка означает не "вот прям сейчас", а "как только поток выполнения освободится".
    Ответ написан
    3 комментария
  • Чем может быть вызвано дрожание окна браузера при динамическом наполнении bootstrap modal?

    Stalker_RED
    @Stalker_RED
    Возможно потому, что https://www.google.com/search?q=reflow+repaint вызываются не при каждом изменении. И это хорошо, ибо иначе оно дико тормозило бы.
    Лучше делать все изменения пока окно еще скрыто, и только потом показывать. Еще лучше - использовать что-то более быстрое, чем добавление элементов по одному (innerHTML рулит!).
    Ответ написан
    1 комментарий
  • Как сделать аналог promise.all из массива промисов с обработкой resolve для каждого промиса?

    lazalu68
    @lazalu68
    Salmon
    Просто в цикле пишите не var i = 0, а let i = 0, тогда в колбэке then сможете использовать этот индекс. Тогда можно и от обертки отказаться.

    Как-то так
    function func(k) {
        return new Promise((resolve, reject) => {
            setTimeout(function() {
                resolve( k**2 );
            }, 1000);
        });
    };
    
    var objs = [
            { a: 6, b: 2 },
            { a: 5, b: 3 },
            { a: 2, b: 4 }
        ],
        arr = new Array(objs.length);
    
    for(let i = 0; i < arr.length; i++) {
        arr[i] = func(objs[i].a);
        arr[i].then(function(result) {
            console.log(`Target index is ${i}, initial value (a) is ${objs[i].a}, result is ${result}`);
        });
    }
    А можно и не сохранять промисы.
    function func(k) {
        return new Promise((resolve, reject) => {
            setTimeout(function() {
                resolve( k**2 );
            }, 1000);
        });
    };
    
    var objs = [
            { a: 6, b: 2 },
            { a: 5, b: 3 },
            { a: 2, b: 4 }
        ];
    
    objs.forEach((item, index) => func(item.a).then(result => console.log(`Target index is ${index}, initial value (a) is ${objs[index].a}, result is ${result}`)));
    Ответ написан
    Комментировать