2017-08-29 23 views
0

私はNodeJSプログラムに少し問題があります。NodeJS forループを非同期にする

私のforループの機能は、SQLデータベースのインデックスを繰り返し処理し、forループを実行するたびにGET要求を行う別の関数を呼び出すことになっています。

それは私のすべての指標を反復しているので、すべてのGETリクエストをすべて一度に/非常に高速にします。これにより、私はもうAPIコールを作成できなくなります。私はsetTimeoutを使ってみましたが、それは次のインデックスに反復して値が確定しないので動作しません。

また、コールバックを試みましたが、何も変更されませんでした。私は非同期を調べてみましたが、私がやっていることに本当に頭を浮かべることはできません。またノートだけで、何も実際に返されていません。私の他の機能では、私はSQL DBを更新しています。私は、実行ごとにAPIコールを作成するためにforループが必要になり、完了後にのみ続行します。

function callGet() { 

    var mysql = require('mysql'); 
    var con = mysql.createConnection({ 
     host: "localhost", 
     user: "USERNAME", 
     password: "PASSWORD", 
     database: "sys" 
    }); 

    con.query("SELECT nameAlone FROM testDB", function(err, result, fields) { 

     var i; 

     for(i = 0; i < result.length; i++){ 

     var name = result[i].nameAlone; 

     var options = { 
      method: 'GET', 
      url: 'site.com', 
      qs: { 
       key: 'MYKEY', 
       page_size: 10, 
       intent: 0, 
       itemName: name 
      }, 
      headers: { 
       'postman-token': postman-token, 
       'cache-control': 'no-cache' 
      } 
     }; 
     getListing(options,result, i);     //Only being called after the for loop iterates through all of result.length 
} 
    }); 
} 

何が起こっているかの例がこれです、のは、0-2からのループが繰り返さために言わせて、各ランの名前をプリントアウト関数を呼び出します。 代わりの

index:0, name:Chris, index:1, name:Tony, index:2, name:John 

これは、プリントアウトします:任意の助けを事前に

index:0, index:1, index:2, name:Chris, name:Tony, name:John 

感謝を。

編集:私はすでに提案された重複した質問で自分の問題に適用されたすべての回答を試みました。そこの答えの一つで回り込みを試みているが、それがうまくいくかどうかは分からない。

Edit2:そこのすべてのソリューションが機能しませんでした。

EDIT3(溶液):誰もが非常にシンプルなソリューションを望んでいる場合、私はセットアップに非常に簡単だったこのパッケージが見つかりました:私がしなければならなかったすべては私の指標とセットアップasyncLoopを持つ配列を作成https://github.com/nathan818fr/async-loop

ました

asyncLoop(indices, function (item, next) 
{ 
    var name = result[item].nameAlone; 
    var options = { 
     method: 'GET', 
     url: 'site.com', 
     qs: { 
      key: 'MYKEY', 
      page_size: 10, 
      intent: 0, 
      itemName: name 
     }, 
     headers: { 
      'postman-token': postman-token, 
      'cache-control': 'no-cache' 
     } 
    }; 

    getListing(options,result, item); 
    next(); 
}, function() 
{ 
    console.log('Finished!'); 
}); 
+0

[Javascriptの非同期ループ処理]の可能な重複(https://stackoverflow.com/questions/9772400/javascript-async-loop-processing) – Paul

+0

はすでに実際とsetTimeoutsを使用しようとしました:ここではデモがあります遅延とsetTimeout 0のトリック。 – Tony

+0

@Paul提案されている質問は、長時間実行しているタスクをスレッドから排除し、他のタスクを飢えさせるのを止める方法です。この質問は、ループの各反復で非同期操作が完了するのを待つことにあるようです。 – apsillers

答えて

0

私の 'ploop'関数を約束して使うことができます。 ploopは、基本的に、約束を返す関数と、関数が必要とする引数と、行なわれるかどうかを決定する関数とを取ります。あなたは第4引数を書きません。

// Function that returns a promise 
var searchForNumber = function(number) { 
    return new Promise(function(resolve, reject) { 
     setTimeout(function() { 
     var min = 1; 
     var max = 10; 
     var val = Math.floor(Math.random()*(max-min+1)+min); 

     console.log('Value is: ' + val.toString());   

     return resolve(val);   
     }, 1000); 
    }); 
}; 

// fn  : function that should return a promise. 
// args : the arguments that should be passed to fn. 
// donefn : function that should check the result of the promise 
// and return true to indicate whether ploop should stop or not. 
// promise: A promise value that is used internally by ploop and should never 
// be passed in by the caller of ploop. 
var ploop = function(fn, args, donefn, promise) { 
    return (promise || Promise.resolve(true))  
     .then(function() { 
      return(fn.apply(null, args)); 
     }) 
     .then(function(result) { 
     var finished = donefn(result); 
     if(finished === true){ 
      return result; 
     } else { 
      return ploop(fn, args, donefn, promise); 
     } 
    }); 
}; 

var searchFor = 4; 

var donefn = function(result) { 
    return result == searchFor; 
}; 

console.log('Searching for: ' + searchFor); 
ploop(searchForNumber, [searchFor], donefn) 
    .then(function(val) { 
    console.log('Finally found! ' + val.toString()); 
    process.exit(0); 
    }) 
    .catch(function(err) { 
    process.exit(1); 
    }); 

すべてが、ploop機能自体がサンプルコードである:それは数4が見つかるまで以下の乱数を描画するploopを用いた例です。

http://jsbin.com/woxetos/edit?js,console

+0

私はこれを試してみましょう今感謝、これを試してみるいくつかのコードを移動する必要があります – Tony

+0

私はすべての設定をしていたので、やや異なるソリューションを見つけることができたので、今はうまくいきますが、ソリューションに私を導いてくれました。私のコードを処理し終えたら、このソリューションを提供します。試してみてください。私は前に約束事に取り組んでいなかったので、しばらく私を受けました。再度、感謝します – Tony