Может ли цепочка обещаний узла не работать синхронно? - PullRequest
0 голосов
/ 21 февраля 2019

Если у меня есть последовательность обещаний / функций, как в примере ниже, возможно ли, чтобы функции разрешались не по порядку?У меня есть одна функция, которая представляет собой запрос мангуста, и обновление, а затем другая отправляет данные в представление.Мое представление загружается, но не отражает правильные результаты результатов запроса mongoose.

let function_one(data) = function(){
  return new Promise( function(resolve, reject) {  
    {do stuff...    
      resolve('howdy');
    }
  });
};

let function_two(some_data) = function(){
  return new Promise( function(resolve, reject) {  
    {  do stuff...    
    resolve('howdy');
    }
  });
};  

let function_three(some_data) = function(){
  return new Promise( function(resolve, reject) {  
    {do stuff...    
      resolve('howdy');
    }
  });
};  

let function_four(some_data) = function(){
  return new Promise( function(resolve, reject) {  
    {do stuff...    
      resolve('howdy');
    }
  });
};  

function_one(data).then(function(result){
  return function_two(result);
}).then(function(result){
  return function_three(result);
}).then(function(result){
  return function_four(result);
}).then(function(result){
  console.log(result);
}).catch(err => console.log("Caught " + err));

Вот код, который я собрал: Это как если бы "res.json ({status: 200, data:результат});"выполняется до того, как поиск мангуста завершится?

let gettheinformation =  function(invoicelist3){
    return new Promise(  function(resolve, reject) {
        // console.log(invoicelist3);
            Product.aggregate([
                {
                    $match: {
                        Priced: true
                    }
                }
                ,
                {
                    $group: {
                        _id: "$Invoice",
                        pricedcount: {$sum: 1}
                    }
                }
            ], function (err, result) {
                if (err) {
                    console.log(err);
                } else {
                    resolve(result);
                }
            });
    });
};


let getinvprodspriced =  function(invlist){
    return new Promise(  function(resolve, reject) {
           // console.log(invlist);
        for(var oo = 0; oo < invlist.length; oo++){
        Invoicestatus.update({Invoice:invlist[oo]._id}, {Noofitemspriced: invlist[oo].pricedcount}, {upsert: true},  function (err) {}); 
        }
        resolve(invlist);
        });
};

let getinvprodcount = function(invprodcount){
        return new Promise(  function(resolve, reject) {
    Product.aggregate([
                {
                    $group: {
                        _id: "$Invoice",
                        pradcount: {$sum: 1}
                    }
                }
            ], function (err, result) {
                if (err) {
                    console.log(err);
                } else {
                  // console.log(result);
                    resolve(result);
                }
            });

    });
}


let saveinvprodcount =  function(invprodcount){
    return new Promise(  function(resolve, reject) {
        for(var ok = 0; ok < invprodcount.length; ok++){
        Invoicestatus.update({Invoice:invprodcount[ok]._id}, {Noofitems: invprodcount[ok].pradcount}, {upsert: true},  function (err) {}); 
        }
        resolve(invprodcount);
        });
};

let getarrdocs =  function(result){
    return new Promise( function(resolve, reject) {
        Invoicestatus.find({}, function(err, docs){
          resolve(docs); 
        });       
    });
};

router.get('/fetcharrdata', function(req, res) {


    gettheinformation().then(function(result){
      return getinvprodspriced(result);
    }).then(function(result){
      return getinvprodcount(result);
    }).then(function(result){
      return saveinvprodcount(result);
    }).then( function(result){
      return getarrdocs(result);
    }).then(function(result){


        res.json({status: 200, data: result});


    }).catch(err => console.log("Caught " + err));

});

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Проблема заключается в методах saveinvprodcount для цикла, функция разрешается до выполнения функции Invoicestatus.update,

let saveinvprodcount =  function(invprodcount){
return new Promise(  function(resolve, reject) {
    for(var ok = 0; ok < invprodcount.length; ok++){
    Invoicestatus.update({Invoice:invprodcount[ok]._id}, {Noofitems: invprodcount[ok].pradcount}, {upsert: true},  function (err) {}); 
    }
 //this will resolve before completion of Invoicestatus.update
    resolve(invprodcount);
    });
};

Сначала обновите функцию обновления, затем используйте массив для хранения обещаний, и вы можете использовать promise.allвыполнить все обещания сразу.Смотри ниже

 let saveinvprodcount = function (invprodcount) {
 let promises = [];
 for (var ok = 0; ok < invprodcount.length; ok++) {
     promises.push(updateData(invprodcount[ok]));
 }
 return Promise.all(promises);
 };

 let updateData = function (invProd) {
 return new Promise(function (resolve, reject) {
    Invoicestatus.update({ Invoice: invProd._id },
        { Noofitems: invProd.pradcount }, { upsert: true }, function (err) {
            if (err)
                reject(err);
            else
                resolve();
        });
     });
   };
0 голосов
/ 21 февраля 2019

Да.Ты можешь сделать.используя Promise.all([promise1, promise2, promise3]), чтобы позволить им работать асинхронно и получить результат сразу.Однако в этом случае результатом первого вызова является ввод, вам нужно дождаться его, прежде чем запускать второй.Таким образом, вы должны работать в последовательности (из-за бизнес-логики, а не из-за природы языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...