Friday, April 08, 2016

Пример простой промисификации синхронного callback кода на Javascript

Задача - спрашивать пользователя подтверждение операции удаления.

Что может быть проще?

if(askUser("Delete all posts?")) {
    console.log("delete all posts");    ss.ds.clearPosts();}

Но функция askUser() построена на базе Framework7 функции app.confirm() результат, которой передается в callback функции по Ок и Cancel соответственно.

myApp.confirm(_message, appTitle,    function () {
       //Ок - нажата
    },    function () {
       // Cancel нажата
    }
);


Ну и что? Скажете вы - строим функцию askUser с параметрами для call back функции

function askUser(_message, _funcOk, _ funcCancel) {
myApp.confirm(_message, appTitle,    function () {
       //Ок - нажата
       _funcOk();
    },    function () {
       // Cancel нажата
      _funcCancel();
    }
);
}
(При чем callback для cancel нам в этом конкретном случае и не нужен)
И это правильное решение! Но про него я вспомнил после обертки асинхронных функций в Promise объект, которые я изучал и изучаю.
Промисифицированная функция askUser() выглядит так
function askUser(_message) {
    return new Promise(function(resolve, reject){
        myApp.confirm(_message, appTitle,  function () {
                resolve(true);           
 },            
function () {
                reject(false);          
  }
        );    
});}
Т.е. если пользователь нажал Ок, то Promise объект переходит в состояние resolved, иначе - в состояние reject. А само использование askUser() в этом виде будет таким
askUser("Delete all posts?").then(function(_data){
    console.log("delete all posts");    
ss.ds.clearPosts();});
Описываю - при нажатии кнопки Ok, promise объект переходит в состояние resolve, а значит последовательно вызывается функция в then, куда передается результат resolve (тут true, но может быть объект).
Но что же даёт использование Promise, если можно реализовать тоже самое более простым и привычным способом.
РАСШИРЯМОСТЬ. Функциональная. 
А вот надуманные примеры - спрашивая пользователя мы можем проверить, а имеет ли он вообще спрашивать о подобном, путём запроса прав через ajax запрос на сервер или асинхронный запрос к БД. 
Или после подтверждения на удаление начинать процедуру удаления, которая тоже построена на базе асинхронного кода (callback ах, у меня в этом месте просто обнуляется массив и сохранятся в таком виде).

No comments: