2016-06-29 79 views
0

我在試圖用本機JS「循環」到多個「嵌套」承諾時出現問題。當「循環」它們時,不能在原生承諾之間傳遞數據

我有很多能級一個JSON如下所示:

{ 
    "project": { 
     "name": "TESTNAME", 
     "label":"string11405", 
     "description":"das", 
    }, 
    "form": [{ 
     "label": "string", 
     "name": "string", 
     "fields": [{ 
      "label": "string", 
      "name": "string", 
      "field_type_id": "string", 
      "meta": [{ 
       "meta_name": "string", 
       "meta_value": "string" 
      }] 
     }] 
} 

所以我檢查,我需要使用Promise.all

return Promise.all(_.map(req.crfData ,(value,index,arr) => { 
     var table = 'TABLE1'; 

     return conn.query(`INSERT INTO ${table} SET ?`,[value]); 
    })) 
    .then((result) => { 
     var table = 'TABLE2'; 

     return Promise.all(_.map(req.fieldData ,(value,index,arr) => { 
      value.crf_id = result.insertId; 
      return conn.query(`INSERT INTO ${table} SET ?`,[value]); 
     })); 
    }) 
    .then((result) => { 
     var table = 'TABLE3'; 

     return Promise.all(_.map(req.fieldData ,(value,index,arr) => { 
      return conn.query(`INSERT INTO ${table} SET ?`,[value[0]],(err) => next(err)); 
     })); 
    }) 
    .catch((err) => next(err)); 

這個問題是與第二個查詢(表2),我無法從以前的承諾檢索MySQL的新ID,因爲result包含一個承諾,而不是此時,相應的數據應該返回。

感謝您的幫助。

+0

我期望'result'包含來自第一個查詢的數據。那個結果var的'conole.log'是什麼? – steampowered

+0

'result'包含一個包含單個promise的結果的數組(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#Using_Promise.all) – mhu

回答

1

你的第一個result參數將是一個數組,無論conn.query()如何解決(這就是Promise.all()解決的問題)。因此,result.insertId將爲undefined,因爲result是一個數組,而不是具有命名屬性的對象。

.insertId將是result的每個單獨數組元素上的屬性。如果你想從前面的查詢返回的最後結果讀它,那麼你可以使用這樣的事情:

result[result.length - 1].insertId 

這與.insertId如何爲一個單一的INSERT操作設置如下所示Return last inserted id with mySQL一致。