2017-11-07 4 views
0

ID 배열과 호출해야하는 수정 끝점이 있습니다. 그래서 ID의 배열을 foreach하고 각 ID에 해당하는 rest API 호출을 만들고 싶습니다. 끝점을 "넘치게"하고 싶지 않으므로 각 호출 사이에 잠깐 기다려야합니다. 또한 새로운 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(); 

. 이제

는, 내가 행동하고 싶은 방법 (콘솔) 다음과 같습니다 http://plnkr.co/edit/sNfk8GIfqbhrpql5hQ16?p=preview

:

여기
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 

가 작동 예제 :

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 

이 내가 무엇을 얻을

정확히 내가 여기에 누락 되었습니까?

+0

당신은'setTimeout' 콜백 대기 결코

난 당신이 기능을 기다려야 쓰기 좋습니다. 사실 콜백을 기다릴 수는 없지만, 단지'serviceMock'에서 보여준 것과 똑같은 지연을 위해 약속을 만들 수 있습니다. – Bergi

+0

음,이게 뭔가? http://plnkr.co/edit/7n6ysTt0tn9UdlUV7ppp 여전히'setTimeout'에서 이것을해야합니다 :'1000 * index'? – uglycode

+0

그렇습니다. 그렇지만 a) 콜백 내에서가 아니라 지연 후 자체'await'에'serviceMock (id)'를 넣으십시오. b) 지연 약속을 위해 도우미 함수를 만드십시오. c) 곱하기 더 이상 – Bergi

답변

0

간단한 재귀 솔루션 : ID 배열의 현재 색인을 보유하는 변수 var i = 0을 만듭니다. 다음은 API 호출을 수행하는 x() 함수를 만듭니다. API 호출의 성공 함수에서 i 즉 ID 배열의 현재 색인을 증분 한 다음 i == array.length을 확인한 다음 거짓 호출 인 경우 아무 것도하지 않고 x() 함수를 다시 호출하십시오.

+0

이것은 내 현재 솔루션입니다, 예,하지만 재귀가 이런 종류의 작업에는 불필요하다고 생각했습니다. 변수를 증가시키지 않았지만 배열에서 첫 번째 ID를 취했습니다. http://plnkr.co/edit/xcS1vkOD4qzWMHMORb5u – uglycode

2

'await'을 setTimeout에 넣지 마십시오.

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