2016-08-01 12 views
1

자바 스크립트의 원인이 아닌 실제 약속의 해결 약속의 배열을 반환합니다 다음 코드자바 스크립트 비동기은/

class SomeClass { 
    async someFunc() { 
    const urlParameters = [0, 1, 2]; 
    const batchAjaxResult = await urlParameters.map((parameter) => { 
     const result = await $.get(`someUrl/${parameter}`); 
     return { 
      parameter, 
      result 
     } 
    }); 

    console.log(batchAjaxResult); 

    } 
} 

을 감안할 때 Array.map 내부의 약속()에 대한 기다리고 있습니다.

이것은 아마도 Array.map()이 Promise로 구현되지 않았기 때문일 수 있습니다.

Array.map의 약속 기반 버전이 있습니까?

Array.map 안에 배치 된 일괄 처리 된 응답을 반환하는 방법에 대한 질문이므로이 질문은 How to return the response from an asynchronous call과 다릅니다.

+0

구체적 [이 응답 (http://stackoverflow.com/a/30180679/542251) – Liam

+1

@Liam 이미 사용하고 언급 ES7 비동기/AWAIT 구문의 바닥쪽으로 보이는 . 이 문제는 Array.map을 사용할 때만 발생합니다. 'const X = Array.map (...)을 기다리는 중 '은 아직 구현되지 않은 것 같습니다. –

+2

배열이 아닌 약속 만 '대기'할 수 있습니다. 'Promise.all (배열)'을 기다려보십시오. – jib

답변

1

이 질문을 쓰면서 나는 그 문제의 근원에 도달 할 수있었습니다. 그것은 블루 버드처럼 보인다

Promise.map

라는 같은 기능 이와 비슷하게이 다음과 같이 내가 코드를 바꾼 "대량 약속"

를 생성 Promise.all라는 기본 구현이며이 작동하고 있습니다

class SomeClass { 
    async someFunc() { 
     const urlParameters = [0, 1, 2]; 
     const batchAjaxResult = await Promise.all(
      urlParameters.map(async (parameter) => { 
      const result = await $.get(`someUrl/${parameter}`); 
      return { 
       parameter, 
       result 
      } 
     }) 
    ); 
     console.log(batchAjaxResult); 

    } 
} 
+2

arrow 함수 자체도 비동기 적이어야합니다. –

+0

"작동 중"입니다. 구문 오류가 있기 때문에 의심의 여지가 있습니다. – zerkms

+0

죄송합니다. 예, 화살표 기능이 비동기 여야합니다. 코드 –

3

연속 실행을 약속하는이 간단한 함수를 사용할 수 있습니다.

,210

function asyncMap(arr, mapper) { 
 
    var q = Promise.resolve(); 
 
    return Promise.all(arr.map(v => q = q.then(() => mapper(v)))); 
 
} 
 

 

 
// Usage 
 

 
asyncMap([1, 2, 3], v => { 
 
    return new Promise(resolve => { 
 
    console.log("Start " + v); 
 
    setTimeout(() => { 
 
     console.log("End " + v); 
 
     resolve("foo" + v); 
 
    }, 500); 
 
    }); 
 
}).then(a => console.log(a));

+0

을 수정했지만 병렬 실행을 찾고있었습니다. 브라우저가 데이터를 하나씩 UI로로드하는 것을보고 싶지는 않습니다. –

+0

@ TobiasMühl 좋아요, 질문 자체에 이런 종류의 것들을 언급하는 것이 가장 좋습니다. –