2016-02-10 2 views
0

Хотя я уже давно знаю обещания, я действительно только начинаю их использовать (или создавать) совсем недавно.Обещания/A - запись функции, которая соответствует обещаниям

Мое требование - создать функцию, совместимую с обещаниями, чтобы вызывающий мог вызвать, а затем связать ее с другими вызовами функций.

простая функция, как это ...

/** 
* Checks if a user is available in cache. If avaialble, returns 
* the hash object of this user. If the cache is not enabled, or 
* the user is not found in cache, it returns null object. 
* 
**/ 
function chkUserInCache(username, password, done) { 
    var cacheKey = "partner:" + username; 
    if (cache == null) return done(null); 

    // Look for the user in the cache. 
    cache.hgetallAsync(cacheKey).then(function(result){ 
    if (result === null) return done(null); 
    else return done(null,result); 
    }); 
} 

И вызываемая функция будет называть как:

chkUserInCache(u,p) 
.then(result) { 
    // do something 
}).catch(function(e){ 
    // do something 
}); 

В настоящее время один из способов я знаю, чтобы использовать Bluebird обещание, а затем вызвать promisify по моей функции, чтобы получить объект функции, совместимый с обернутым обещанием.

Но если у меня много таких функций (скажем, от 6 до 10), я должен продолжать называть promisifiy на каждом из них и хранить возвращаемые объекты где-нибудь и использовать его?

Или есть ли другой способ? Или, есть ли собственный способ написания обещания совместимый код?

Для простого использования10 полезных функций, какой был бы лучший подход, если таковой имеется?

ответ

0

Используйте соответствующий API обещаний.

Учитывая, что hgetAllAsync уже является функцией возврата обещаний, нет причин для promisify chkUserInCache или даже использовать конструктор Promise. Вместо этого, вы должны удалить этот done обратный вызов и просто вернуть обещание:

function chkUserInCache(username, password, done) { 
    var cacheKey = "partner:" + username; 
    if (cache == null) return Promise.resolve(null); 

    // Look for the user in the cache. 
    return cache.hgetallAsync(cacheKey); 
} 
+0

Да, точно, я искал такого рода 3-й линии, которая говорит «вернуть Promise.resolve (значение), все еще имея некоторые похмелья Probs пытаются vade в javascript обещает, исходя из ac/C++/java background :) –

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