2016-06-08 68 views
2

这是从我的表中获取详细信息的代码。打印预期格式的JSON数组

function listshops(callback) 
{ 
var array=[3,4];/*shopId*/ 
    async.each(array,function(dat,callback){ 

    async.parallel([ 

     function(callback){ 
      client.connection.query('select * from shop where shopId=?',dat,function(err,data1){ 
      callback(null,data1); 

      }); 
     },  

     function (callback) { 
      client.connection.query('select * from image where shopId=?',dat,function(err,data2){ 
      callback(null,data2); 

      }); 
     } 
    ], 
    function(err,data) 
    { 
     var result = data.reduce(function(prev, curr) { /*merging the array*/ 
      return prev.concat(curr); 
     }); 
     console.log(result); 
    }); 
}); 

} 

我有一个像这样的输出:: http://i.stack.imgur.com/NVUAu.png

我想打印我的结果在下面的格式:

{ 
"shops": [ 
    { 
     "shopId": "3", 
     "shopName": "1", 
     "address": "abc", 
     "contactNumber":"1234" 
     "images": [ 
      { 
       "imageId": "1", 
       "shopId": "3", 
       "imageUrl": "aaa", 
      }, 
      { 
       "imageId": "2", 
       "shopId": "3", 
       "imageUrl": "bbb", 
      }, 
     ] 
    }, 
    { 
     "shopId": "4", 
     "shopName": "2", 
     "address": "bbb", 
     "contactNumber":"1234" 
     "images": [ 
      { 
       "imageId": "3", 
       "shopId": "4", 
       "imageUrl": "ccc", 
      }, 
      { 
       "imageId": "4", 
       "shopId": "4", 
       "imageUrl": "ddd", 
      }, 
     ] 
    }, 
] 

我得到的值,但有些混乱中获取的值。

回答

0

此处有两个嵌套的异步任务,paralleleach

并行负责获取店铺信息和一间店铺的图像,并用包含任务结果的两个元素数组调用最终回调。

这是你的最后回调平行:

function(err,data) 
     { 
      var result = data.reduce(function(prev, curr) { /*merging the array*/ 
       return prev.concat(curr); 
      }); 
      console.log(result); 
     }); 

data应该是一个两个元件阵列,其中元件0是商店,以及元件1是图像。你只需将它们连接在一起。如果您想以所需格式显示图像,则应该执行data[0].images = data[1]将图像键添加到您的商店。

到目前为止是针对一家商店。然后有外环each循环。你目前没有给这个最后的回调,也没有对结果做任何事情。

事情是这样的:

 function listshops(callback) 
{ 
var array=[3,4];/*shopId*/ 
    async.each(array,function(dat,eachCallback){ 

    async.parallel([ 

     function(parallelCallback){ 
      client.connection.query('select * from shop where shopId=?',dat,function(err,data1){ 
      parallelCallback(null,data1); 

      }); 
     },  

     function (parallelCallback) { 
      client.connection.query('select * from image where shopId=?',dat,function(err,data2){ 
      parallelCallback(null,data2); 

      }); 
     } 
    ], 
    // this is the final callback for parallel 
    function(err,parallelResult) 
    { 
     // construct one shop 
     var shop = parallelResult[0]; 
     shop.image = parallelResult[1]; 
     // pass the shop info back as a result to each 
     eachCallBack(shop); 
    }); 
}, 
// this is the final callback for each 
function(err, eachResult) { 
    // eachResult is an array with the shops returned from parallel callback 
    var result = { 
     shops: eachResult 
    } 

    return result 
} 
); 

} 

我不能对此进行测试,所以不认为这是一个确切的解决方案,但一个解释。为了更好的理解,我重命名了变量,您不必在代码中这样做。要记住的关键是你在这里有两个嵌套的任务,就像嵌套循环一样,你也必须在两个层次上处理结果。