2015-02-07 1 views
0

나는 블루 브래드를 promisifyAll으로 초기화하면서 몽구스를 사용하고 있습니다. 시원하고 약속을 사랑합니다. 하지만 mongoose의 model.save()(err, user, numAffected)과 같은 함수 시그니처를 반환하므로 bluebird의 model.saveAsync()은 명백한 결과가 아닌 2 요소 배열을 반환합니다.더 나은 saveAsync를 사용하여 Mongooose 프로토 타입을 확장하는 방법

function saveUser(user) { 
    return user.saveAsync() 
     .spread(function (user, numAffected) { 
      return user; 
     }); 
} 

몽구스 프로토 타입에 promisification의 시간이 추가 만에 한 번해야하는 것이 훨씬 쉬울 것이다 : 이것은 내가 이렇게 작은 도우미 기능을 만들기 위해 찍은 그래서 불편 체인한다 전체 응용 프로그램 ...하지만 난 어떻게 모르겠다.

답변

1

이 3.0에서 해결 될 것입니다하지만 지금은 필터와 사용자 정의 promisifier 사용할 수 있습니다

// Promisifies only methods named "save" 
Promise.promisifyAll(require("mongoose"), { 
    filter: function(name) { 
     return name === "save" 
    }, 
    promisifier: function(save, defaultPromisifier) { 
     var saveAsync = defaultPromisifier(save); 
     return function() { 
      return saveAsync.apply(this, arguments).spread(function(first) { 
       return first; 
      }); 
     } 
    } 
}); 
// Promisify rest of the mongoose... it will ignore save as it was already promisified 
Promise.promisifyAll(require("mongoose")); 
+0

이것은 완벽합니다! 건배 @에 사리 야 – RichieRich

0

당신은 패치를 수 그리고 user.saveAsync

var user_saveAsync = user.saveAsync; 
user.saveAsync = function() { 
    return user_saveAsync.bind(this)() //-> same as calling `user.saveAsync()` 
     .spread(function(user) {  // but now you're returning spreaded result 
      return user; 
     }); 
} 

방금 ​​할 수

function saveUser(user) { 
    return user.saveAsync(); 
} 
+0

을 사실 ...하지만 그것은 사용자에게만 적용됩니다. 모든 절약을 위해 더 나은 약속을하는 것이 더 나으십시오. – RichieRich

관련 문제