2017-11-30 21 views
2

私は実際にmongodbの参照をjavascriptのmongooseを使ってこれらの参照のドキュメント値(info.value)に変換しようとしています。モンゴース非同期リクエスト管理

マップを使用して/ forEachを試してみましたが、mongooseリクエストは非同期であるため、何もしませんでした。

この種のコードにはあまり使用されていませんが、私が試したすべての事の後に少し失われてしまいました。

誰かが私にこの点についてのヒントを教えてもらえますか?

ちょうど情報のために、テンプレートの読み込み、mongoへの接続について心配する必要はありません。他のすべてがうまく動作しているからです。 "console.log(cond [c]);/console.log(info);"(cond [0])このエラーが発生した場合、 c]とinfoがnullで未定義です)

ブロック・オブジェクトの "content"プロパティにサブブロックを配置する予定であるため、この関数も再帰的に準備する必要があります。

お世話になりました。

// Input condition 
"H1Vf3KTef || false" 

// Expected result 
"1 || false" 

// Buggy Function 
var execIfBlock = function recursExec (query, callback) { 
    IfBlockModel.findOne(query, function(err, ifBlock) { 
    if (!err) { 
     var cond = ifBlock.condition.split(" "); 
     //console.log('Block : ' + ifBlock); 
     //console.log('Condition : ' + cond); 
     var calls = new Array(); 
     for (var c = 0, len = cond.length; c < len; c++) { 
     if (shortId.isValid(cond[c])) { 
      calls.push(function() { 
      InfoModel.findOne({ _id: cond[c] }, function(err, info) { 
       console.log(cond[c]); 
       console.log(info); 
       cond[c] = info.value; 
      }); 
      }); 
     } 
     } 
     async.parallel(calls, function(err, result) { 
     console.log(result); 
     // Do some job using the final expected result : "1 || false" 
     }); 
    } 
    }); 
}; 

// Info template 
{ 
    "_id": "H1Vf3KTef", 
    "value": "1" 
} 

// Bloc template 
{ 
    "_id": "rkRBtLTef", 
    "content": [], 
    "condition": "H1Vf3KTef || false" 
} 

// Info schema 
var InfoSchema = new Schema({ 
    _id: { type: String, unique: true, required: true, default: shortId.generate }, 
    value: { type: String, default: "0" } 
}); 

// Bloc schema 
var IfBlockSchema = new Schema({ 
    _id: { type: String, unique: true, required: true, default: shortId.generate }, 
    condition: { type: String, required: true, default: true }, 
    content: [{ type: String, required: true, default: '', ref: 'block' }] 
}); 
+2

あなたが新しいのNode.jsを使用することはできますかあなたには、いくつかの古いバージョンで立ち往生していますか? – libik

答えて

0

使用の約束と小さな関数でコードを破る:

var execIfBlock = function recursExec(query, callback) { 
    IfBlockModel.findOne(query, function (err, ifBlock) { 
     if (!err) { 
      var cond = ifBlock.condition.split(" "); 

      updateMultipeInfo(cond) 
       .then(values => { 
        console.log(values) // [values1, values ,...] 
       }); 
     } 
    }); 
}; 


function updateMultipeInfo(cond){ 
    return Promise.all(cond.map(updateInfo)) 
} 

function updateInfo(id){ 
    if (shortId.isValid(id)) { 
     return InfoModel 
      .findOne({ _id: id }) 
      .then(info => info.value); 
    } else { 
     return Promise.reject("invalid id"); 
    } 
} 
+0

これは私が必要としていたものでした。ありがとうございました! –

+0

それを聞いてうれしい、あなたを歓迎しているBro :) –

関連する問題