2014-12-18 4 views
1

Mongoose 모델 집합의 데이터베이스 업데이트 스크립트에 Highland.js을 사용하려고 시도 중이므로 호출에서 Model.find()에 매우 적합합니다. 몇 가지 동기식 작업 (새로운 스키마, 몇 가지 정리 작업을 수행하기 위해 내 모델을 업데이트하는 작업)이 있으며 마지막에는 save() 문서를 원합니다. 실행해야 할 사전 저장 후크가 있는데 업데이트는 실제로는 곧바로 Model.update()과 호환되지 않습니다. 이것은 "권리"인 경우 약속을 해결하기 위해Highland.js에서 비동기 변환

var sender_stream = Sender.find({}).stream(); 
var promise_save = function(document) { 
    var deferred = Q.defer(); 
    document.save(deferred.makeNodeResolver()); 
    return _(deferred.promise); 
} 

var sender_deferred = Q.defer(); 
_(sender_stream).map(function(sender) { 
    // set some fields on sender... 
    return sender; 
}).map(promise_save).series().on('done', sender_deferred.resolve).resume(); 

그러나이하지 않는 것 나는 확실하지 않다 : 나는 Q.js와 하이랜드의 조합을 통해 작업 정렬의 그것을 얻을 관리했습니다 길을 잘 유지하고 스트림을 유지하는 방법 ... Q.js와 Highland.js를 너무도 친밀하게 결합하는 것이 이상하게 보입니다. 더 좋은 방법이 있습니까?

+0

업데이트 : 'done'이벤트가 반환되지 않는 데이터보다 호출되지 않는 문제가 점점 더 좋아 보이고 있습니다. 하이랜드가 의도 된 방식인지 확실하지 않습니다. –

답변

3

Q 또는 Highland에 대해 많이 알지 못합니다. 그러나 이것은 querystreams의 변환 함수에 대한 간단한 사용 사례처럼 보입니다.

var stream = Sender.find({}).stream({ transform: manipulate }) 

function manipulate(document) { 
    // do stuff here 
    return document; 
} 

stream.on("data", function(document) { 
    stream.pause() 
    document.save(function(error) { 
     // error handle, maybe stream.destroy([err]) if you want it to stop immediately 
     stream.resume(); 
    }); 
}); 

stream.on("error", function(err){ 
    //error handle 
}); 

stream.on("close", function(){ 
    console.log("hopefully this worked for you"); 
}); 

변형 기능은 '데이터'이벤트를 방출하기 전에 문서에서 실행됩니다. 일단 변환 함수가 그 일을 처리하면 반환 값이 'data'함수로 보내집니다. 그런 다음 일시 중지/저장/다시 시작하십시오.

1

Promise 대신 Highland의 비동기 기능 (http://highlandjs.org/#async)을 사용할 수 있습니다. 당신은 비동기 기능 스타일 대신 하이랜드와 그 포장하지만 여전히 난 다시 하나 개의 문서 스트림에 그 흐름을 평평하게 .flatMap() 대신 .map()의 및 .series()를 사용하는 것이 좋습니다 Q.

를 추가 피할 수 있도록 몽구스는 또한 약속을 반환합니다. 그런 다음 .done()을 추가하면 .resume() 대신 '완료'이벤트 리스너를 사용하여 썽크를 만들 수 있습니다.

'done'이벤트가 발생하는 이유에 대해 100 % 확신하지 못했습니다.

var sender_stream, set_fields, save, sender_deferred; 

sender_stream = Sender.find({}).stream(); 

save = function save(document) { 
    return _(function(push, next) { 
     document.save(function(err, result) { 
      push(err, document); 
      push(null, _.nil); 
     }); 
    }); 
}; 

set_fields = function setFields(sender) { 
    // set some fields on sender... 
    return sender; 
}; 

sender_deferred = Q.defer(); 

_(sender_stream) 
    .map(setFields) 
    .flatMap(save) 
    .done(function() { 
     sender_deferred.resolve(); 
    }); 
관련 문제