2016-10-17 1 views
0

編集 を編集することはできません、どのように私はこれを解決しない... getCurrenciesasync.forEach仕上げをしても最初の時間を実行しているように見えるでしょうか?私は約束を返すことは、本質的にこれらの約束を一緒に「連鎖する」と思ったのですか?NodeJSの約束は、精密検査の際に、既存の「モデル」

mysqlからトランザクションを読み取ろうとする以下のコードがあります。テーブルのサイズとクエリに要する時間の長さのために、私はそれを分解して、約束を使ってオブジェクトを生成します。ただし、getCurrenciesはモデルのcurrencyCodeを更新しませんが、両方ともconsole.logが正しい値を報告します。誰かが私が間違ってやっていることを説明できますか?私はまだ約束をするのは新しいです。ありがとう。

主要被写体建物

connection.query(query).then(function(items) { 
     async.forEach(items, function(element) { 
      element.ptype = 'merchants'; 
      element.type = 'transactions'; 
      element.currencyCode = null; 

      getCurrencies(element.currencies_id).then(function(result) { 
       console.log(result.currencyCode); 
       element.currencyCode = result.currencyCode; 
       console.log(JSON.stringify(element)); 
      }); 
     }); 

     res.send(items); 
    }); 

getCurrencies両方console.log S

から

function getCurrencies(transactionId) { 
    var currencies_query = ''; 
    currencies_query += 'SELECT '; 
    currencies_query += 'iso_code AS currencyCode, '; 
    currencies_query += 'name AS `currencyName`, '; 
    currencies_query += 'symbol AS `currencySymbol`, '; 
    currencies_query += 'exponent AS `currencyExponent`, '; 
    currencies_query += 'iso_num AS `currencyNumber` '; 
    currencies_query += 'FROM '; 
    currencies_query += 'currencies '; 
    currencies_query += 'WHERE '; 
    currencies_query += 'id = ' + transactionId; 

    return new Promise(function(resolve, reject) { 
     connection.query(currencies_query).then(function(rows) { 
      resolve(rows[0]); 
     }); 
    }); 
}; 

と出力あなたが見ることができるように郵便配達

{ 
    "id": 11213615, 
    "pid": 103845, 
    "uri": "/rest/transactions/11213615", 
    "puri": "/rest/merchants/103845", 
    "path": "/resellers/1/customers/2368/merchants/103845/transactions/11213615", 
    "transactionID": 11213615, 
    "currencies_id": 1, 
    "transactionUri": "/rest/transactions/11213615", 
    "ptype": "merchants", 
    "type": "transactions", 
    "currencyCode": null 
    } 

から210

GBP 

{"id":11213595,"pid":100856,"uri":"/rest/transactions/11213595","puri":"/rest/merchants/100856","path":"/resellers/1/customers/5/merchants/100856/transactions/11213595","transactionID":11213595,"currencies_id":1,"transactionUri":"/rest/transactions/11213595","ptype":"merchants","type":"transactions","currencyCode":"GBP"} 

結果のAPIレスポンスは、currencyCodeはまだnullある - なぜ?あなたが見ることができるように:(

+0

ための約束と 'async'を使用する必要はありません - 私はそれが

connection.query(query) .then(function(items) { var arPromises = []; async.forEach(items, function(element) { element.ptype = 'merchants'; element.type = 'transactions'; element.currencyCode = null; arPromises.push( new Promise(function (resolve, reject) { getCurrencies(element.currencies_id) .then(function(result) { element.currencyCode = result.currencyCode; resolve(element); }).catch(function (error) { //do something with error if(error) reject(error); }); }) ); }); return Promise.all(arPromises); }).then(function(items){ res.send(items); }).catch(function (error) { if(error) console.log(error); }); 

そして、私のアドバイス、「キャッチ」ブロックで仕上げチェーンを動作するはずだと思います。 –

+0

また、問題を[mcve] –

+0

に分けてください。これは何度も書き直しました。そして、最初の約束の結果をどのようにループしても、2番目のサブクエリは、結果が返されるまで実行されません。 – LokiSinclair

答えて

関連する問題