Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Промисы(общения) (https://javascript.ru/forum/misc/51982-promisy-obshheniya.html)

FanAizu 28.11.2014 17:14

Промисы(общения)
 
setTeimout 0

Не могу понять в чем профит от использования промисов?
Какая разница, что я напишу так:
setTimeout(function(){
че-то делаю
}, 1000);

или заюзаю промисы и сделаю тоже самое по сути
promise = new Promise(function(resolve, reject){
setTimeout(function(){
че-то делаю
resolve();
});
});

Одно и тоже по сути, зачем же тогда появились промисы, в чем профит?

tsigel 28.11.2014 17:26

Это нужно для упрощения восприятия алгоритма.

Например у вас есть метод в котором вы делаете запрос, но не 1, а десяток. И после выполнения всех запросов вам надо что-то сделать. Обещания позволяют не разрывать эту логическую цепочку, раскидывая её по методам объекта.

Яростный Меч 28.11.2014 17:43

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

традиционный подход с калбэками "вырастает вправо"
myFunc(..., function(data) {
    ...
    myFunc2(data, function(data1) {
        ...
        myFunc3(data1, function(data2) {
            ...
        
        });
    });
});


вариант с промисами остается линейным:
myFunc(...)
  .then(function(data) {
    ...
    return myFunc2(data);
  })
  .then(function(data) {
    ...
    return myFunc3(data);
  })
  .then(function(data) {
    ...
    return myFunc4(data);
  });

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


ну и есть функция Promise.all - подождать, когда выполнятся все промисы в массиве.

плюс есть обработка ошибок и исключений (второй параметр в then или первый - в методе catch).

из этих элементов можно комбинировать произвольные конструкции, которые на калбэках смотрелись бы убийственно.

danik.js 28.11.2014 17:52

Цитата:

Сообщение от FanAizu
Промисы(общения)

Не общения, а обещания ))


Часовой пояс GMT +3, время: 03:13.