2016-06-08 100 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 
} 
); 

} 

我不能對此進行測試,所以不認爲這是一個確切的解決方案,但一個解釋。爲了更好的理解,我重命名了變量,您不必在代碼中這樣做。要記住的關鍵是你在這裏有兩個嵌套的任務,就像嵌套循環一樣,你也必須在兩個層次上處理結果。