2017-07-07 3 views
0

私は、より多くの関数と少ないループを使用して、より機能的な方法でコードを作成する方法を学びたいと考えています。私はconnectBingを呼び出す間にタイムアウトを実装したい。私は変数を使用せず、繰り返しの間に1秒のタイムアウトを得ることが可能かどうか疑問に思っていました。私のコードは現在動作していますが、私はそれを書くことなく他の方法を探しています。setTimeoutと約束を使用して、このJSコードをより機能的にするにはどうすればよいですか?

これは私のコードです:

// MAIN 
getAllPosts().then((posts) => { 
    posts 
     .forEach((post, i) => { 
      setTimeout(() => { 
       connectBing(anchorText,console.log).then() 
      } ,i * 1000) 
     }) 

// CONNECT TO BING WITH KW AND DO SOMETHING 
function connectBing(anchorText,doSomethingWithBing) { 
    var deferred = q.defer();                 
    request('https://www.cnn.com/search?q=' + anchorText, function (error, response, body) {  
     error ? console.log('error:', error) :              
     console.log('statusCode:', response && response.statusCode);        
     (doSomethingWithBing) ? doSomethingWithBing(body) : "You didn't give connectBing anything to do!"  
    }) 
    return deferred.promise     
} 
+1

あなたが現在あなたはあなたが求めているものを確認してください....私秒のタイムアウトがない得る反復間の1秒間のタイムアウトを取得いけないことを書いている途中... –

+0

あなたは何をしようとしていますか?ここで、1kクエリがあった場合、1k秒間に1kクエリが生成されます。私の理解では、サーバーを迷惑させず、より高いレートで処理を続けるための並行モデルを探しています。 –

答えて

1

あなたは他の後に実行する非同期機能やチェーンそれぞれの配列を取ることができます。デモのために本来の約束を使用し、使用しているライブラリにマップすることができます。

まず、非同期機能の配列を取り込む関数を作成します。これは、チェーン1他をした後、返す意志の最後:

function connectBing() { 
    // Pretend we are connecting to a data source 

    return Promise.resolve(); 
} 

function delay(ms) { 
    // Return a promise that resolves when the timeout is up 

    return new Promise(resolve => setTimeout(resolve, ms)); 
} 

let fns = posts.map(post =>() => { 
    return connectBing() 
     .then(() => delay(1000)) 
     .catch(() => console.log('error')); 
}); 

チェーン機能に:

function chainAsyncFns(fns) { 
    // Ensure we have at least one promise to return 

    let promise = Promise.resolve(); 

    fns.forEach(fn => promise = promise.then(fn)); 

    return promise; 
} 

は次に、各ポストのため、connectBingを呼び出してから、タイムアウトを待つことになる非同期関数を作成次々に実行します。

chainAsyncFns(fns).then(() => console.log('done')); 
+0

処理中にエラーが発生した場合はどうなりますか? –

+1

@ mh-cbon良い質問ですが、私はこの例を挙げるにはどれくらいの距離があるか分かりませんでした。私は、非同期関数を作成するときにエラーをキャッチするために私の例を更新しました。 –

関連する問題