Piszemy funkcję promisify, która zamienia funkcje wyższego rzędu w modelu error-first na obiekty thenable. Do dzieła.

Przykład funkcji wyższego rzędu z obsługą error-first:

function confirmAndCall(prompt, cb){
    let response = confirm(prompt);
    if(!response){
        cb(new Error("Not confirmed"));
    } else {
        cb(null);
    }
}

Przykłady użycia:

confirmAndCall("Do you agree for cookies?", function(err){
        if(err){
            console.warn(err);
            return;
        }
        console.log("Im writing some cookies");
});

confirmAndCall("Can i redirect you?", function(err){
        if(err){
            console.warn(err);
            return;
        }
        location.href = "https://www.google.com";
});

Promisify:

function promisify(originalFn) {
    return function (...args) {
      return new Promise((resolve, reject) => {
        originalFn(...args, (err, result) => {
          if (err) {
            reject(err);
          } else {
            resolve(result);
          }
        });
      });
    };
  }

Użycie:

const confirmAsync = promisify(confirmAndCall);

confirmAsync("Can I redirect you?")
    .then(function(){
        location.href = "https://www.google.com";
    })
    .catch(function(err){
        console.warn(err);
    });

Temat będziemy zgłębiać, choć sama świadomość tego, czym jest proces promisify to już dużo – jest sporo bibliotek, które mogą robić to za nas.