Вызов метода на стороне сервера Meteor для асинхронной простой - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть простая функция, включающая некоторую логику как для серверной, так и для клиентской части. Во-первых, мне было интересно, должна ли она быть написана асинхронно или нет, но из-за того, что она содержит метод вызова Meteor (который всегда асинхронный), я решила, что он также должен быть асинхронным, поэтому функция search_for_products выглядит следующим образом:

функция search_for_products (опции, weight_1, weight_2, weight_3, weight_4, callback) {

function function1(param1){
..
}
function function2(param2){
..
}
function function3(options){
..
}

let sortedProducts=[]

 Meteor.call('solve', options, function(error, result){
  if(error){
        console.log("Error");
    }else{                              
        console.log("Success");

        products=function1(result)
        function2(param2)
        function3(options)
        //some calculations that result in an Object sortedProducts
        sortedProducts
        //Session.set("sortedProducts",sortedProducts); //this is for client side


 }
 })
 callback (sortedProducts)

}
exports {search_for_products}

Когда дело доходит до вызова его из метода на стороне сервера, где мой код выглядит так:

if (Meteor.isServer){
    Meteor.methods({ 
    recommendProducts:function(user){
        //some db find queries to set an object that will invoke the plain function 
        options={....}
        const convertAsynctoSync = Meteor.wrapAsync(search_for_products);
        // pass arguments to the function
        const resultofAsynctoSync=convertAsynctoSync(options,weight_1,weight_2,weight_3,weight_4)
        console.log("test syncFun", convertAsynctoSync)
        console.log("resultofAsynctoSync",resultofAsynctoSync)

        return resultofAsynctoSync;
        }
    })
    }

Я вижу из журналов, что функция вызывается, но возвращаемое значение никогда не устанавливается в результате AsynctoSync, поэтому я пропускаю эти 2 строки

console.log("test syncFun", convertAsynctoSync)
console.log("resultofAsynctoSync",resultofAsynctoSync)

из консоли, чтобы убедиться, что она действительно возвращает правильные результаты. Должен ли я обращаться с этим по-другому с обещаниями вместо wrapAsync? Можете ли вы дать подсказку, потому что я немного запутался с темой «Волокна, обещания» и когда лучше всего их использовать.

...