2012-11-30 2 views
1

node.js 서버에서 발생하는 메모리 문제의 원인을 좁히려합니다. 내가 항상 조금 불편했던 코드의 한 부분은 Q 약속을 사용하는 것입니다.Node.js Q :: Q.ninvoke chain으로 약속합니다.

여기 내 기본 구조가 어떻게 생겼는지입니다 :

var Q = require('q'); 
MyClass.prototype.doSomething = function(somedata, callback) { 
    var res = [];// will contain the results of each function call 

    Q.ninvoke(this, 'doSomethingElse', 'hello!') 
    .then((function(result){ 
     res.push(result); 
     return Q.ninvoke(this.someobject, 'someFunction', somedata); 
    }).bind(this)) 
    .then((function(result){ 
     res.push(result); 
     callback(null, res);// Returns both result objects, in an array 
    }).bind(this)) 
    .fail(callback) 
    .done(); 
} 

이 논리적 보이는가?

doSomethingElse 함수에서도 약속을 사용하면 어떻게됩니까? 여기에 모든 것이 적절하게 적용됩니까?

답변

3

나에게 꽤 단단 해 보인다. Node.js 콜백 API를 노출하는 한 (예 : nodeify을 통해, 최근 업데이트 된 API reference 참조) 약정을 사용하는 this.doSomethingElse에는 아무런 문제가 없습니다.

- 밝혔다

다음과 같이 나는 당신의 기능을 다시 것입니다 : 하나의 주어진 달리 당신이 두 번째 기능은 처음의 결과에 의존 경우에 인 경우에

MyClass.prototype.doSomething = function(somedata, callback) { 
    return Q.all([ 
     Q.ninvoke(this, 'doSomethingElse', 'hello!'), 
     Q.ninvoke(this.someobject, 'someFunction', somedata) 
    ]).nodeify(callback); 
}; 

여기에, 나는

MyClass.prototype.doSomething = function(somedata, callback) { 
    return Q.ninvoke(this, 'doSomethingElse', 'hello!').then(function (result) { 
     return Q.invoke(this.someobject, 'someFunction', result); 
    }.bind(this)) 
    .nodeify(callback); 
}; 

아니면

MyClass.prototype.doSomething = function(somedata, callback) { 
    var doSomethingElse = Q.nfbind(this.doSomethingElse.bind(this)); 
    var someFunction = Q.nfbind(this.someobject.someFunction.bind(this.someobject)); 

    return doSomethingElse('hello!').then(someFunction).nodeify(callback); 
}; 
할 거라고

-

더 일반적으로 : 우리는 최근에 Q 성능 및 메모리에 대한 작업을 수행했으며 그 결과는 주로 출시되지 않은 master 브랜치에 있습니다. 특히 : 긴 스택 관련

+0

내가 틀렸다면 정정하십시오. 그러나 Q.all은 비동기 실행을 의미합니다. 내 예제에서는 순차적으로 실행해야한다고 명시 적으로 언급하지 않았지만 일반적으로 제 2 함수는 첫 번째 함수의 결과에 의존합니다. 이 경우, 나의 모범은 "최선의 방법"입니까? 아니면 더 좋은 점이 있습니까? –

+0

약속은 기본적으로 비동기 실행이므로 어떤 의미인지 확신 할 수 없습니다. 첫 번째 결과에 의존하는 두 번째 함수의 경우 'then'이 실제로 올바른 선택입니다. 예제가 포함되어 있습니다. – Domenic