2014-01-30 2 views
2

Я создаю функцию удобства, и я хотел бы вернуть обещание функций в виде функции .then. В настоящее время у меня есть:Предоставление обещания обернутой функции

function foo(a, b){ 
    b = b || 'default'; 

    asyncBar(a + " " + b, function(err, value){ 
    if(err) 
     console.log("oh shit"); 
    else 
     return value; 
    } 
}; 

Я мог бы добавить обратный вызов аргумент Foo, но не только в том, что неуклюжем, но это устранило бы «удобство» из функции удобства. Я бы предпочел только foo.then(function(){...}), но я не уверен, как сдать обещание от asyncBar().

UPDATE: Я делаю это в Node.js, а обратный вызов - из случайной библиотеки JSON-RPC. Я предпочел бы использовать ES6-Promises, если это необходимо ....

+0

вы хотите запрограммировать 'deferred' из JQuery в ванильным Javascript или что' .then() 'вы имеете в виду, или же тег' jQuery' Мисс? – loveNoHate

+0

@dollarvar jQuery - это _one_ библиотека, которая имеет ограниченную (и некорректную) реализацию обещаний. Есть более серьезные библиотеки обещаний, которые предлагают более богатые и гораздо более быстрые функции, такие как Bluebird, RSVP или Q. –

+0

@BenjaminGruenbaum Спасибо, я только узнал, что это даже «родная» (если экспериментальная) функция Javascript. – loveNoHate

ответ

2

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

var bar = Promise.promisify(asyncBar); 
function foo(a, b){ 
    return bar(a + " " + b || 'default'); 
} 

Здесь мы promisifying функцию и затем возвращая его. Затем вы можете сделать foo.then... - обработка ошибок может быть выполнена во втором аргументе пункта .then или в предложении .catch.

Если вы используете другую (ламер) библиотеку обещания, что в отличие от Bluebird (или Q, например) предлагает эту функциональность из коробки - вы можете сделать:

//assuming broken jQuery "promises" 
function foo(a, b){ 
    var d = $.Deferred(); 
    asyncBar(a + " " + b, function(err, value){ 
     if(err){ 
      d.reject(); 
      console.log("oh shit"); 
     } else { 
      d.resolve(value); 
     } 
    }); 
    return d.promise(); 
}; 

Если мы говорим о ES6 (JavaScript.next) обещания, синтаксис будет:

function foo(a, b){ 
    return new Promise(function(resolve,reject){ 
     asyncBar(a + " " + b, function(err, value){ 
     if(err){ 
      console.log("oh shit"); 
      reject(); 
     } else { 
      resolve(value); 
     } 
    }); 
}; 
Смежные вопросы