티스토리 뷰


발생일: 2013.09.24

키워드: 노드, Node.js, Q, 프라미스, Promises

문제:
최근 진행 중인 프로젝트엔 모든 비동기 작업에 프라미스 패턴을 적용해 구현하고 있다.


프라미스 구현체로는 Q 라이브러리(https://github.com/kriskowal/q)를 사용하고 있다.


노드 서버에도 Q로 프라미스 패턴을 도입했는데,

Q에서는 노드 콜백 패턴을 쉽게 프라미스 객체로 변경할 수 있는 메서드를 제공하고 있어서 편리하다.



해결책:


https://github.com/kriskowal/q#adapting-node


노드의 콜백은 function (err, result) 형태의 패턴을 따른다.

q 라이브러리에서는 이런 콜백을 프라미스 객체로 래핑할 수 있게 다양한 방법을 제공하고 있다.



nfcall = node function call

nfapply = node function apply


return Q.nfcall(FS.readFile, "foo.txt", "utf-8");

return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);



객체에 바인딩해서 호출하는 경우.


ninvoke = call과 동일

npost = apply와 동일


return Q.ninvoke(redisClient, "get", "user:1:id");

return Q.npost(redisClient, "get", ["user:1:id"]);



`denodefy()` 로 Q 객체로 만들 수 있다.

객체에 바인딩이 필요한 경우, `nbind()`를 호출한다. (node bind)


var readFile = Q.denodeify(FS.readFile);

return readFile("foo.txt", "utf-8");


var redisClientGet = Q.nbind(redisClient.get, redisClient);

return redisClientGet("user:1:id");



deferred 객체에서 `makeNoodeResolver()`를 호출해도 된다.


var deferred = Q.defer();

FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());

return deferred.promise;



반응형
댓글
공지사항