티스토리 뷰
발생일: 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;