2017-07-01 25 views
0
createDatabase(){ 
request({ 
     url: `http://${nodeName}:port?format=json`, 
     auth: { 
      'username': 'admin', 
      'password': 'admin', 
      'sendImmediately': false 
     }, 
     method: 'POST', 
     json: true, 
     body: payload 
     }, 
     function (error, response, body) { 
      if (response.statusCode != "201") { 
      resolve(response.statusCode); 
      done(); 
      } 
      else { 
      reject(); 
      done(); 
      } 
     }) 
} 

これは私のアプリケーションでデータベースを作成するために使用しているコードです。私は複数のデータベースの例を作成する必要があります - db1、db2、db3など この場合、私はこのためのループを実装したいです。しかし、これは非同期なので、私はそれを処理することができません。 この場合、約束をどのように扱うことができるかお勧めします。JavaScriptを使用してループを作成する非同期関数

+0

[fetch-api](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)を使用しても問題ない場合は、この[質問](https://stackoverflow.com/q/43454125/4636715) – vahdet

+0

Promise.all(["some"、 "variables"]。map(createDatabase)) –

+0

何をループしますか?それぞれの反復では何が違うでしょうか? – DanielR

答えて

0

まず、request()の代わりにpromiseを返すrequest-promiseモジュールを使用しました。これにより、処理が完了したときに管理するためにプレーンコールバックの代わりに約束を使用することができます。その後

、あなたが並列にすべてのデータベースを作成してOKですし、ちょうど彼らがすべて終了したら、知っておく必要がある場合は、あなたがこれを行うことができます:

const rp = require('request-promise'); 

function createDatabase(payload) { 
    return rp({ 
     url: `http://${nodeName}:port?format=json`, 
     auth: { 
      'username': 'admin', 
      'password': 'admin', 
      'sendImmediately': false 
     }, 
     method: 'POST', 
     json: true, 
     body: payload 
    }); 
} 

let promises = []; 
// some for loop that creates separate payloads to pass to createDatabase 
for (...) { 
    // create payload for each database here 

    promises.push(createDatabase(...)); 
} 

Promise.all(promises).then(function(results){ 
    // process array of results here 
}).catch(function(err) { 
    // handle error here 
}); 

これはにcreateDatabase()にそれぞれの呼び出しからの約束を集めますこれらの約束事がすべて終わったら、Promise.all()を使って、すべての約束の解決された値をresults配列に渡します。

+0

返事をありがとう。しかし、これは次の機能の実行を止めません。リクエストの結果を提供します。次の関数呼び出しでデータベースが作成されたことを確認したいのですが、作成したデータベースのIDを取得しています。 –

+0

@VipulGoyal - nodejsの非同期プログラミングへようこそ。すべてのデータベースが開いた後に実行するコードは、 '.then()'コールバックまたはそこから呼び出す関数の中に入ります。これはnode.jsで非同期プログラミングが動作する方法ですJavascriptには、インタプリタを処理する前にすべての処理を待つようにする方法はありません。代わりに、非同期コールバック内に機能を入れ子にします。複数の非同期操作を調整しようとしているときには、よりクリーンな方法でこれを行うことができます。 – jfriend00

+0

@VipulGoyal - また、何をしているのかをさらに詳しく知りたい場合は、もっとコードを表示して、ここで何をしようとしているのかを確認してください。あなたが示したコードを尋ねたところで、私は答えました。 – jfriend00

関連する問題