2017-08-23 10 views
0
//global array to store dynamodb query result 
    var store = []; 

    //function that to retrive socket data based on user email id as a hash key and give json to pass into query by taking email as input 
    var getSocketParams = (email) => { 
    return { 
     TableName: "socketSockets", 
     KeyConditionExpression: "user_id = :em", 
     ExpressionAttributeValues: { 
      ":em": email 
     } 
    }; 
} 
//query 1 which retrive all sockets details from respective table 
var q1 = (callback) => { 
    retrivalDetail(getSocketParams(em), function(err, res) { 
     if (err) callback(err, null); 
     callback(null, res); 
    }); 
}; 

//query 2 take input as a result of query 1 response and second a callback 
var q2 = (res, callback) => { 
    //here i made some logic to check callback is not executed until all items in query 1 response executed and that respective data fetched from respective table if have any 
    var ctr = 0; 
    res.Items.forEach(function(d) { 
     var payload_params_l = { 
      TableName: "socketPayload", 
      KeyConditionExpression: "#mac = :mac", 
      ExpressionAttributeNames: { 
       "#mac": "mac" 
      }, 
      ExpressionAttributeValues: { 
       ":mac": d.socket_id 
      }, 
      ScanIndexForward: false, 
      Limit: 1 
     }; 
     retrivalDetail(payload_params_l, function(err, res) { 
      if (err) callback(err, null); 
      store.push(res); 
      ctr++;         
      if (ctr === Object.keys(res.Items).length) { 
       callback(null, store); 
      } 
     }); 
    }); 
}; 
//my function call to excute query 1 and query 2 here problem is due to asynchronous nature of node js i guess before getting query 1 result completely query2 will be start executing so i place q2 inside q1 callback here how can i retrive all data from q2 inside loop and pass all data after finishing loop to q2 callback 
function call() { 
    q1(function(err, res) { 
     if (err) done(err, null); 
     q2(res, function(err, res) { 
      if (err) done(err, null); 
      //final function done which gives response to API request done(error ,response) 
      done(null, res); 
     }); 
    }); 
}; 
call(); 

問題への入力として渡している2デシベルクエリでの実行q2をQ2コールバックに入れてください。このコードを改善するための良い提案があります。ループ内のq2からすべてのデータを取得し、q2コールバックにループを完了した後にすべてのデータを渡すことができます。完全QUERY2クエリ1の結果を取得する前に、私は推測によるノードのjsのイベントループの非同期性に1つのクエリの結果は、私が直面しています別のクエリの非同期ノードJSここ

私は初心者です可能であればノードjsの非同期パッケージを非同期モジュールを使用してこれについてどのような助けになるか

答えて

0

関数呼び出し()は、それはあなたがhttps://caolan.github.io/async/docs.html#waterfallをしたい場合は、async.waterfall使用することができ、オーケーだが、機能Q2のために、私のように.......

//global array to store dynamodb query result 
    var store = []; 

    //function that to retrive socket data based on user email id as a hash key and give json to pass into query by taking email as input 
    var getSocketParams = (email) => { 
    return { 
     TableName: "socketSockets", 
     KeyConditionExpression: "user_id = :em", 
     ExpressionAttributeValues: { 
      ":em": email 
     } 
    }; 
} 
//query 1 which retrive all sockets details from respective table 
var q1 = (callback) => { 
    retrivalDetail(getSocketParams(em), function(err, res) { 
     if (err) callback(err, null); 
     callback(null, res); 
    }); 
}; 

var q2 = (res, callback) => { 

    async.forEachOf(res.Item, function (d, index, done) { 

    var payload_params_l = { 
      TableName: "socketPayload", 
      KeyConditionExpression: "#mac = :mac", 
      ExpressionAttributeNames: { 
       "#mac": "mac" 
      }, 
      ExpressionAttributeValues: { 
       ":mac": d.socket_id 
      }, 
      ScanIndexForward: false, 
      Limit: 1 
     }; 
     retrivalDetail(payload_params_l, function(err, res) { 
      if (err) { 
       done(err, null); 
      } else { 
       store.push(res); 
       done(null); 
      } 
     }); 
    }, 
    function (error) { 
     // la fin du traitement de tous les records 
     if (error) callback(error, null) 
     else callback(null, store); 
    }); 
} 



//my function call to excute query 1 and query 2 here problem is due to asynchronous nature of node js i guess before getting query 1 result completely query2 will be start executing 
//so i place q2 inside q1 callback here how can i retrive all data from q2 inside loop and pass all data after finishing loop to q2 callback 
function call() { 
    q1(function(err, res) { 
     if (err) done(err, null); 
     q2(res, function(err, res) { 
      if (err) done(err, null); 
      //final function done which gives response to API request done(error ,response) 
      done(null, res); 
     }); 
    }); 
}; 
+0

https://caolan.github.io/async/docs.html#eachOfはあなたに@yMagありがとう機能async.forEachOf使用することをはるかに優れています先ほど非同期で非同期を使用していないと言っていましたが、非同期でメソッドforEachOfを解決するためには.....ここでは、私が共有したいと思う別のサンプルコードとその作業があります –

関連する問題