2017-08-31 44 views
0

GetPurchaseDataを呼び出すGetAllData()という関数があります。この関数は、すべてのデータがロードされるまで再帰的に自身を呼び出します。エクスプレスリクエストでNodeJS async/await + recursion

async function GetAllData(){ 
    console.log("starting loading purchase data"); 
     await GetPurchaseData(); 
     console.log("purchase data loaded")   
} 

async function GetPurchaseData(){ 
     return new Promise(async function (resolve,reject){ 
      var Headers = { 
       .... 
      } 
      await request({url: xxx, headers: Headers },async function(error, response, body) { 
        var tmp = JSON.parse(body)  
        _.forEach(tmp.Purchases, p => purchaseData.push(p));       

        if (response.headers.pagination){ 
         return await GetPurchasePaginatedData() 
        } 
        else{ 
         console.log("done loading....") 
         return resolve("done") 
        } 
      }); 
     }) 
} 

内のノードJSは、次のような出力出力します

starting loading purchase data 
done loading.... 

をそれは

購入データは、それがほとんどらしい

をロード印刷するGetAllDataまで戻ってくることはありませんその機能にこだわっているように、私の意見は何とか "復帰のラインsolve( "done") "は最初の呼び出しまで戻ってこないので、実際にPromiseを完了としてマークします。

+0

ことの一つは、あなたが明示的に '非同期function'から' Promise'を返す必要がないということです、 'async'は、あなたの関数がどんな' Promise'を返さないことを決定します。 – zero298

+0

また、 'request'は' Promise'やコールバックを受け取りますか?前回私が使ったときには、標準のnode.js形式でコールバックが必要でした。その場合、 '要求'をラップするか、 '約束'で動作するライブラリを見つける必要があります。 – zero298

+0

私は折り返し新しいPromise(...リクエスト()...)をしてリクエストしていますか? – Gio

答えて

0

私はasync/awaitでの経験はあまりありませんが、私が読んだところでは、このようなコードではいけません。

async function GetAllData(){ 
    console.log("starting loading purchase data"); 
     await GetPurchaseData(); 
     console.log("purchase data loaded")   
} 

async function GetPurchaseData(){ 
     let body = await request({url: xxx, headers: Headers }) 

     var tmp = JSON.parse(body)  
     _.forEach(tmp.Purchases, p => purchaseData.push(p));       

     if (response.headers.pagination){ 
      return await GetPurchasePaginatedData() 
     } 
     else{ 
      console.log("done loading....") 
      return "done" 
     } 
} 
+0

これは私の最初のアプローチでしたが、 'let body'の代わりに' let response'を実行していました。私は 'response.headers'と' response.body'に応答を分割していましたが、動作しませんでした。そして、「didntの仕事」によって私はそれが実際に戻ってくる応答のために待っていなかったことを意味する – Gio

1

(もhere参照)async/awaitPromise constructor antipatternを避け、通常のコールバックとしてasync機能を渡す避ける - あなたはuse the Promise constructor to promisify an existing callback APIする必要があります!注意すべき

async function GetPurchaseData() { 
    var headers = {…}; 
    var promise = new Promise((resolve,reject) => { // not async! 
     request({url: xxx, headers}, (error, response, body) => { // not async! 
      if (error) reject(error); 
      else resolve({response, body}); 
     }); 
    }); // that's it! 

    var {response, body} = await promise; 
    for (var p of JSON.parse(body).Purchases) 
     purchaseData.push(p));       

    if (response.headers.pagination) { 
     return GetPurchasePaginatedData() 
    } else { 
     console.log("done loading....") 
     return "done"; 
    } 
}