Próbuję więc ulepszyć istniejący interfejs API, aby wspierać obietnice, ale chcę zachować kompatybilność wstecz. Więc powiedzmy, że to moje API:

module.exports = {

    deliverPost: function(callback) {

        someAsyncFunction(function(err) {

            if (err)
                console.log(err);

            callback(err);
        });
    }
}

To świetnie, mogę to nazwać i przekazać wywołanie zwrotne i wszystko działa.

Teraz robimy to samo z obietnicami:

var q = require('q');

module.exports = {

    deliverPost: function() {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;
        });
    }
}

Świetnie, teraz zwraca obietnicę, ale mój problem jest, każdy stary klienci tego API spodziewają się, że będą mogli przejść w wywołaniu zwrotnym!

Więc czego naprawdę potrzebuję, to coś takiego:

var q = require('q');

module.exports = {

    deliverPost: function(callback) {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;

        }).attachNodeStyleCallback(callback);
    }
}

Więc nowi dzwoniący mogą wykorzystać wsparcie obietnicy, ale wszystko nadal działa, jeśli przejdziesz w wywołaniu zwrotnym.

Jest to wzór używany przez np. jQuery.ajax - Jak mogę zrobić to samo z Q.js?

Oto wdrożenie attachNodeStyleCallback w odniesieniu do odniesienia:

q.makePromise.prototype.attachNodeStyleCallback = function(callback) {

    if (!callback)
        return this;

    return this.then(function(result) {

        callback(null, result);
        return result;

    }, function(err) {

        callback(err);
        throw err;
    })
}
2
bluepnume 22 listopad 2013, 02:02

2 odpowiedzi

Najlepsza odpowiedź

Odpowiedź jest użycie promise.nodeify:

var q = require('q');

module.exports = {

    deliverPost: function(callback) {

        return q.nfcall(someAsyncFunction).catch(function(err) {

            console.log(err);
            throw err;

        }).nodeify(callback);
    }
}
5
bluepnume 22 listopad 2013, 20:25

Możesz po prostu przetestować na wywołanie zwrotne i uruchomić kod zwrotny, jeśli jest obecny:

var q = require('q');
module.exports = {

  deliverPost: function(callback) {
    if(typeof callback === 'function'){
      someAsyncFunction(function(err) {
        if (err)
          console.log(err);
        callback(err);
      });
    }else{
      return q.nfcall(someAsyncFunction).catch(function(err) {
        console.log(err);
        throw err;
      });
  }
}
0
Wyatt 21 listopad 2013, 22:19