2017-08-22 14 views
1

同期する必要があるeachOfループ内にネストされたDBクエリを追加したいと思います。非常に多くの組み合わせを試してみましたが、foreachループの内部では何も動作しません。ノード内のmongodbクエリjs eachOfループ

async.eachOf(nc.virtual_devices, function (vd) { 
     ///////// This code work fine ///////////// 
     var domain = extractDomain(vd.api_url); 
     vd.raw_api_ip = vd.api_ip; 
     vd.api_ip = getProxiedPath(vd.api_ip); 
     vd.raw_api_url = vd.api_url; 
     vd.api_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.api_url.split(domain)[1]; 
      // Path to websocket notifications 
     vd.ws_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.notification_base_uri; 

    //// THIS CODE IS NOT FINE ////////////// 
     if (nc.type === 'XXX'){ 

      var promise = new Promise (function (resolve,reject) { 

      console.log("********XX VD TYPE **********"); 
      console.log(JSON.stringify(vd)); 
      console.log("VD ID VALUE IS ", vd.id); 
      var newID = (vd.id).replace(/\d_/, ""); 
      console.log("VD ID VALUE IS ", newID); 

      var _idofSubgroup; 
      var labeltoSearch = nc.type + ' ' + nc.version; 
      pattern = "/^" + newID + "/i"; 
      test = _idofSubgroup; 
      pattern = newID; 
      console.log(pattern); 

      db.collection('subgroups').findOne({label: labeltoSearch}, function (err, result) { 
       console.log(result._id); 
       _idofSubgroup = result._id; 

       db.collection('exploreposts').find({subgroup: result.id_}, {title: {"$regex": pattern}}).toArray(function (err, results) { 
        console.log(results); 
       }) 
     }); 
     }) 
    } 
    }); 

それの中で約束してみたが、痛みもありました。 これはうまく動作していない試したコードです。任意の提案がいただければ幸いです。、単純に私はあなたがasync.eachOfが、async.each()またはasync.eachSeries()を使用する必要がいないようです

async.eachOf(nc.virtual_devices, function (vd) { 
     ///////// This code work fine ///////////// 
     var domain = extractDomain(vd.api_url); 
     vd.raw_api_ip = vd.api_ip; 
     vd.api_ip = getProxiedPath(vd.api_ip); 
     vd.raw_api_url = vd.api_url; 
     vd.api_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.api_url.split(domain)[1]; 
      // Path to websocket notifications 
     vd.ws_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.notification_base_uri; 

    //// THIS CODE IS NOT FINE with promises also ////////////// 
     if (nc.type === 'XXX'){ 

      var promise = new Promise (function (resolve,reject) { 

      console.log("********XX VD TYPE **********"); 
      console.log(JSON.stringify(vd)); 
      console.log("VD ID VALUE IS ", vd.id); 
      var newID = (vd.id).replace(/\d_/, ""); 
      console.log("VD ID VALUE IS ", newID); 

      var _idofSubgroup; 
      var labeltoSearch = nc.type + ' ' + nc.version; 
      pattern = "/^" + newID + "/i"; 
      test = _idofSubgroup; 
      pattern = newID; 
      console.log(pattern); 

      db.collection('subgroups').findOne({label: labeltoSearch}, function (err, result) { 
       console.log(result._id); 
       _idofSubgroup = result._id; 
       resolve ({id_:_idofSubgroup,pattern1 : pattern}); 
      }) 
     }); 
     promise.then (function(result) { 
      console.log(result.id_); 
      console.log(result.pattern1); 
       db.collection('exploreposts').find({subgroup: result.id_}, {title: {"$regex": result.pattern1}}).toArray(function (err, results) { 
        console.log(results); 
       }) 
     },function (err){ 
      console.log (err); 
     }) 


    } 
    }); 
+0

[async#eachOf](http://caolan.github.io/async/docs.html#eachOf)セクションの「iteratee」の説明に注目してください。 async.jsループステートメントで作業するときは、エラーが発生したときやタスクが完了したら、通常、渡された 'callback'を呼び出す必要があります。 – Mikey

+0

しかし、ループの内側にあるMongodbのクエリとはどのようにリンクしていますか?私は正直なところそれを理解していません。 –

答えて

1

コールバック地獄で立ち往生されていたとして。

これはテストされていないですが、それはあなたがアイデアを得るように、私は意図的に変数や関数に名前を付ける

async.eachSeries(nc.virtual_devices, function iteratee(vd, cb) { 
    console.log('calling iteratee()') 

    var domain = extractDomain(vd.api_url); 
    vd.raw_api_ip = vd.api_ip; 
    vd.api_ip = getProxiedPath(vd.api_ip); 
    vd.raw_api_url = vd.api_url; 
    vd.api_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.api_url.split(domain)[1]; 
    // Path to websocket notifications 
    vd.ws_url = nconf.get('PROXIED_PATH_SCHEME') + vd.api_ip + vd.notification_base_uri; 

    // skip the rest if type is XXX; 
    // you need to explicitedly call the original callback i.e. cb 
    // note the use of return to prevent execution of the rest of the code 
    if (nc.type !== 'XXX') 
     return cb(null); // or cb(); 

    console.log("********XX VD TYPE **********"); 
    console.log(JSON.stringify(vd)); 
    console.log("VD ID VALUE IS ", vd.id); 
    var newID = (vd.id).replace(/\d_/, ""); 
    console.log("VD ID VALUE IS ", newID); 

    // I have no idea what is going here 
    var _idofSubgroup; 
    var labeltoSearch = nc.type + ' ' + nc.version; 
    var pattern = "/^" + newID + "/i"; 
    test = _idofSubgroup; 
    pattern = newID; 
    console.log(pattern); 

    // we're going to use waterfall here as you have 2 async operations, where one is dependent on the other 
    async.waterfall([ 
     function getSubgroup(cb1) { 
      console.log('calling getSubgroup') 
      db.collection('subgroups').findOne({ label: labeltoSearch }, function (err, subgroup) { 
       // if an error occurs, stop waterfall-loop 
       // you do this by passing the error in the callback 
       // again note the use of return here to prevent execution of the rest of the code 
       if (err) return cb1(err); 
       // pass the data to the next task 
       cb1(null, subgroup, pattern); 
      }); 
     }, 
     function getPosts(subgroup, pattern, cb2) { 
      // we will only get here if the last task^went through 
      console.log('calling getPosts') 
      db.collection('exploreposts').find({ subgroup: subgroup._id, title: { $regex: pattern }}).toArray(function (err, posts) { 
       // if an error occurs, stop waterfall-loop 
       if (err) return cb2(err); 
       // do something with posts 
       console.log('posts', posts); 
       // otherwise, keep going 
       // since there are no more waterfall-tasks, waterfall ends 
       cb2(); 
      }); 
     } 
    ], function (err) { 
     console.log('waterfall() done'); 
     // if an error occurred during the waterfall-loop, it will come down here 
     // we will let the original callback i.e. cb deal with this error though 
     if (err) return cb(err); 
     // otherwise we're done 
     // we will let the original callback know everything went well by calling it without any error 
     cb(); 
    }); 

    // you could have also simply do 
// ], cb); 


}, function (err) { 
    console.log('eachSeries() done'); 
    // handle any error that came 
    console.log(err); 
    // send response 
}); 

ようになります。

問題がある場合はログに従ってください。

+0

ありがとうございました。また、nodejsでの非同期プログラミングのあいまいさを理解するチュートリアルの推奨事項 –

関連する問題