2017-11-07 11 views
0

私はIDの配列と呼び出す必要がある修正エンドポイントを持っています。だから私は、IDの配列をforeachし、各IDの対応する休息APIコールを作成したい。エンドポイントを「フラッド」させたくないので、私は各コ​​ールの間に1秒間待たなければなりません。また、新しいIDでエンドポイントを呼び出す前に応答を待っています。setTimeoutを使用して休止APIコールを一時停止する

は、ここで私が思い付いたものです:serviceMockでsetTimeoutは、残りのAPIコールをシミュレートするために使用され、そしてmainsetTimeoutは、呼び出しの間に一時停止するために使用される

// Code goes here 
console.clear(); 

const url = 'some-domain.com/v1/api/users'; 
const ids = [1, 2, 3, 4, 5, 6, 7]; 
const serviceMock = (id) => new Promise((resolve, reject) => { 

    console.log('Got request for id ' + id); 
    setTimeout(() => { 

    resolve(`${url}${id} returned ${ Math.floor((Math.random() * 100) + 1)}`); 
    }, 2000); 
}); 

const main = async() => { 

    let index = 0; 
    for (let id of ids) { 

    index++; 
    setTimeout(async() => { 

     const data = await serviceMock(id); 
     console.log(`Done for user ${id}!`); 
     console.log(data); 
    }, 1000 * index); 
    } 
}; 

main(); 

。次のように

さて、私はそれが動作するように希望の方法は、(コンソールで)です:

Got request for id 1 
Done for user 1! 
some-domain.com/v1/api/users1 returned 77 
Got request for id 2 
Done for user 2! 
some-domain.com/v1/api/users2 returned 75 
Got request for id 3 
Done for user 3! 
some-domain.com/v1/api/users3 returned 26 
Got request for id 4 
Done for user 4! 
some-domain.com/v1/api/users4 returned 44 
Got request for id 5 
Done for user 5! 
some-domain.com/v1/api/users5 returned 79 
Got request for id 6 
Done for user 6! 
some-domain.com/v1/api/users6 returned 52 
Got request for id 7 
Done for user 7! 
some-domain.com/v1/api/users7 returned 34 

これは私が得るものです:

Got request for id 1 
Got request for id 2 
Got request for id 3 
Done for user 1! 
some-domain.com/v1/api/users1 returned 77 
Got request for id 4 
Done for user 2! 
some-domain.com/v1/api/users2 returned 75 
Got request for id 5 
Done for user 3! 
some-domain.com/v1/api/users3 returned 26 
Got request for id 6 
Done for user 4! 
some-domain.com/v1/api/users4 returned 44 
Got request for id 7 
Done for user 5! 
some-domain.com/v1/api/users5 returned 79 
Done for user 6! 
some-domain.com/v1/api/users6 returned 52 
Done for user 7! 
some-domain.com/v1/api/users7 returned 34 

はここで働い例です:http://plnkr.co/edit/sNfk8GIfqbhrpql5hQ16?p=preview

私はここで何が欠けていますか?

+0

をあなたは 'setTimeout'コールバックを待つことはありません。実際には、コールバックを待つことはできません。約束を待つことができます。ちょうど 'serviceMock'でデモンストレーションしたのとまったく同じように、遅延のためのものを作成してください。 – Bergi

+0

うーん、これのようなもの? http://plnkr.co/edit/7n6ysTt0tn9UdlUV7ppp 'setTimeout':' 1000 * index'でこれを行う必要がありますか? – uglycode

+0

はい、そのようなものですが、a) 'serviceMock(id)'をコールバックの中ではなく、遅延の後の 'await'に入れます。b)遅延プロミスのヘルパー関数を作成します。それ以上の倍数化 – Bergi

答えて

0

単純な再帰的解答: ID配列の現在のインデックスを保持する変数var i = 0を作成します。 次に、API呼び出しを行うx()関数を作成します。 API呼び出しの成功関数では、i、つまりID配列の現在のインデックスを増やしてから、i == array.lengthをチェックします。falseの場合は何もしません。x()を再度呼び出します。

+0

これは私の現在の解決策です、はい、私は再帰がこの種の作業には少し不必要だと考えました。私は変数をインクリメントしませんでしたが、配列から最初のIDを取得しました。 http://plnkr.co/edit/xcS1vkOD4qzWMHMORb5u – uglycode

2

setTimeoutに 'await'を入れないでください。私はあなたがを書く示唆

機能待た:

const wait = ms => new Promise(
    (resolve, reject) => setTimeout(resolve, ms) 
); 

を今すぐ簡単に入力できます。

const main = async() => { 

    let index = 0; 
    for (let id of ids) { 
    index++; 

    await wait(1000); 

    const data = await serviceMock(id); 
    console.log(`Done for user ${id}!`); 
    console.log(data); 
    } 

}; 

main(); 
+0

興味深いアプローチ、私は言う必要があります!ここに実例http://plnkr.co/edit/lbZBh7fRrm2ehFQHzmcO?p=infoがあります – uglycode

関連する問題