2015-03-11 2 views
0

[я отвечу на этот вопрос, но не стесняйтесь добавлять решения или другие проблемы, которые могут возникнуть]мангуст обещание и Q обещание

Работа над nodejs проектом, в котором мы используем Q обещания сильно и мангуста я нашел некоторые unintuitive hickups, объединяющий два.

Первое, что обещание мангуста не имеет .fail или .catch.

Другим является то, что Model.create возвращает обещание, которое вызывает функцию разрешения с mutliple аргументами при разрешении. Если это пройдет через Q, то Q вызовет решение только с первым аргументом.

Пожалуйста, не стесняйтесь добавлять больше проблем, которые могут возникнуть; Я расскажу, как я решил эти вещи в ответ.

ответ

0

Потому что мангуст обещание не имеет .catch или .fail (Обратите внимания, что д удалит их из своей библиотеки, а) вы не можете вернуть неисправный мангуст обещания на стек водн, который заканчивается либо .catch или .fail без сначала превратив его в aq. Вот как я это сделал (это был дан ответ в другом месте на стеке, а):

function something(){ 
    return q()//make sure this function returns a promise instead of an unhandled error 
    .then(function(){ 
    //do some stuff 
    }) 
    .then(function(){ 
    return someMongoosePromise 
    .then(function resolve(res){//make sure to return a q promise if this function is called in a stack that has 
    //.then.then.then(function(){return something();}).fail(... 
     return q.resolve(res); 
     },function reject(err){ 
     return q.reject(err); 
     } 
    ); 
    }); 
} 

Вторая проблема, которую я столкнулся, что Model.create ([doc1, doc2]) решает обещание с несколькими аргументами, но при переходе через QQ только вызовы решить с одним аргументом:

q() 
.then(function(){ 
    return Model.create([doc1,doc2]); 
}) 
.then(function(docs){ 
    docs===doc1;//David Copperfield took doc2 
}); 

раствор примерно такой же, как и первый:

q() 
.then(function(){ 
    return Model.create([doc1,doc2]) 
    .then(function(){//let mongoose resolve the promise 
    var ret=[],i=arguments.length; 
    while(--i>-1){ 
     ret.push(arguments[i]; 
    } 
    return q.resolve(ret); 
    }); 
}) 
.then(function(docs){ 
    docs===[doc1,doc2]; 
}); 
+0

Вашего второго решения [на самом деле не работает] (http://stackoverflow.com/q/23803743/1048572) – Bergi

+0

@ Bergi Завтра я посмотрю, возможно, скопируйте ошибку с ошибкой – HMR

+0

Ой, проигнорируйте этот комментарий. Это просто слишком похоже на отсроченный антипаттерн, извините. Но вам вообще не нужно использовать 'q.resolve' и' q.reject' там вообще, просто 'return ret' будет достаточно. – Bergi

3

Вы можете просто использовать Q function бросить Мангуст обещает «правильные» Q - это работает на самом деле с каждым последующим.

Так просто использовать

Q(someMongoosePromise) .then(…).catch(…); 

Multiple arguments это другая проблема. Однако есть очень простой взлом: преобразовать их в массив и работать с ним.

Q(Model.create([doc1,doc2]).then(Array)) .spread(function(d1, d2){ … }); 

(Это решение не применяется в случае Model.create возвращает перспективны для одного номера)

+0

Что касается способности mongoose указывать альтернативные библиотеки обещаний. 'mongoose.Promise = require ('q'). Promise;' – Jaime

+0

@Jaime Да, это хорошая идея. Не уверен, почему я не упоминал об этом, может быть, он не был поддержан ни Q, ни mongoose 2 года назад. – Bergi

Смежные вопросы