Задать вопрос
Carduelis
@Carduelis
Web-developer, front-end, js, less

Как просто использовать Deferred-объекты без jquery (производительность при большом кол-ве объектов)?

Есть удобная конструкция в jquery
$.when(d1,d2,d3).then( done, fail);
Удобно создавать и резолвить deferred объекты
d1 = $.Deffered();
d1.resolve(mydata);

1) А как это делать без jquery, на нативном es6, и так же, в две строчки?
2) У меня рендерятся поля. Их может быть очень много. Сильно ли скажется на производительности, если каждый из этих полей будет иметь свойство-объект с deferred? Отложенное свойство мне нужно для отслеживания рендеринга полей на странице. Я использую рендер полей пачками по 30 через setTimeout.
3) Можно ли, отказаться от setTimeout(func,0) в сторону чего-то более быстрого? (в моем случае, рендер 1 поля занимает 1,9-2,4 мс, а время ожидания между циклами setTimeout(func,0) - 25-30ms, что очень критично. Поэтому и ренедрю пачками по 30 штук. -- получается (1,9...2,4)*30 ~ 60-70ms + 25-30ms делэй от таймера.
  • Вопрос задан
  • 211 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
1) А как это делать без jquery, на нативном es6, и так же, в две строчки?

Deffered в jQ - это недобитый Promise. А они поддерживаются теперь почти везде, а для остальных есть полифил.

2) У меня рендерятся поля. Их может быть очень много. Сильно ли скажется на производительности, если каждый из этих полей будет иметь свойство-объект с deferred? Отложенное свойство мне нужно для отслеживания рендеринга полей на странице. Я использую рендер полей пачками по 30 через setTimeout.

На производительности вообще не скажется, только на потреблении памяти.

3) Можно ли, отказаться от setTimeout(func,0) в сторону чего-то более быстрого? (в моем случае, рендер 1 поля занимает 1,9-2,4 мс, а время ожидания между циклами setTimeout(func,0) - 25-30ms, что очень критично. Поэтому и ренедрю пачками по 30 штук. -- получается (1,9...2,4)*30 ~ 60-70ms + 25-30ms делэй от таймера.

Вы setTimeout используете, чтобы каждая порция рендерилась на следующем тике, чтобы UI не повис? В таком случае, возможно, стоит вынести рендеринг в WebWorker.
Ответ написан
k12th
@k12th
console.log(`You're pulling my leg, right?`);
$.when(d1,d2,d3).then( done, fail);
d1 = $.Deffered();
d1.resolve(mydata);

Promise.all([d1,d2,d3]).then( done, fail);

// если нужен сразу зарезолвенный промис
Promise.resolve(mydata)

// если нужно создать и зарезолвить когда-то потом, то сложнее
var resolver;
new Promise((resolve, reject) => {
    resolver = resolve;
});
// ...
resolver(mydata);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы