2013-11-21 1 views
2

Итак, я пытаюсь обновить существующий api для поддержки обещаний, но я хочу поддерживать обратную совместимость. Итак, допустим, что это мой апи:Создайте api, который принимает обратный вызов, а также возвращает обещание

module.exports = { 

    deliverPost: function(callback) { 

     someAsyncFunction(function(err) { 

      if (err) 
       console.log(err); 

      callback(err); 
     }); 
    } 
} 

Это здорово, я могу назвать его и передать обратный вызов, и все работает.

Теперь мы делаем то же самое с обещаниями:

var q = require('q'); 

module.exports = { 

    deliverPost: function() { 

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

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

Отлично, теперь она возвращает обещание, но моя проблема в том, какие старые клиенты этого API ожидать, чтобы иметь возможность пройти в обратный вызов!

Так что мне действительно нужно что-то вроде этого:

var q = require('q'); 

module.exports = { 

    deliverPost: function(callback) { 

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

      console.log(err); 
      throw err; 

     }).attachNodeStyleCallback(callback); 
    } 
} 

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

Это шаблон, используемый, например. jQuery.ajax - как я могу сделать то же самое с Q.js?

Вот реализация attachNodeStyleCallback для справки:

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; 
    }) 
} 

ответ

5

Ответ заключается в использовании 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); 
    } 
} 
0

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

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

Да, но это МНОГО шаблона по сравнению с приведенным выше примером. Я не хочу делать это повсюду. – bluepnume

 Смежные вопросы

  • Нет связанных вопросов^_^