2017-02-27 4 views
10
이 코드로 컴파일시 오류가 받고 있어요

:비동기/기다리고 있습니다 배열 #지도() 내부

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue); 
     } 
    }); 
}; 

오류 메시지는 다음과 같습니다

await is a reserved word

왜 내가 이런 식으로 사용할 수 없습니다 ?

는 또한 다른 방법을 시도했지만 그것은 나에게 같은 오류 제공 :

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     const myNewValue = await service.getByValue(myValue); 
     return { 
      id: "my_id", 
      myValue: myNewValue 
     } 
    }); 
}; 
+1

비동기 화살표 기능을 사용할 수 있다고 생각하지 않습니다. – Pointy

+0

관련 https://github.com/tc39/ecmascript-asyncawait/issues/7 –

+1

링크 된 github 토론을 요약하면 콜백으로 전달하는 익명 함수가 'async'가 아니기 때문에이를 수행 할 수 없습니다 안쪽의'await'은 외부 함수에 영향을 줄 수 없습니다. –

답변

20

:

업데이트 : 우리는 최고 수준의 어느 날을 기다리고 얻을 수 있습니다.

여기에 할 수있는 일은 비동기로 map으로 전달하는 것입니다. 즉, map은 일련의 약속을 반환합니다. 모든 약속이 반환 될 때 결과를 얻으려면 Promise.all을 사용할 수 있습니다. Promise.all 자체가 약속을 반환하므로 외부 함수는 async 일 필요는 없습니다.

const someFunction = (myArray) => { 
    const promises = myArray.map(async (myValue) => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
    return Promise.all(promises); 
} 
+0

이 경우 배열의 배열에 대해 고전적인 것보다 느리지는 않습니까? – stackdave

+0

@stackdave 아마도 차이점은 'service.getByValue' 옆에 중요하지 않을 수 있습니다. 이는 네트워크 호출을 포함 할 수 있습니다 ... – lonesomeday

+0

감사합니다. 사용하기 시작했습니다. 어쨌든 가독성은 속도보다 낫습니다. ES6 비동기 기법의 대부분은 항상 느려지지만, – stackdave

4

내가 map의 기능이 비동기하지 않기 때문에 그건 당신이 가질 수 있도록 은 그것의에을 기다리고, 믿습니다을 return 문. 그것은이 수정과 컴파일 :

const someFunction = async (myArray) => { 
    return myArray.map(async (myValue) => { // <-- note the `async` on this line 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
}; 

Try it out in Babel REPL

그래서 ... 그것은 당신의 응용 프로그램의 나머지 부분을 볼 수 있지만, 당신이 뭘 하려는지에 의존하지 않고 추천을주고, 어느 내부을 할 수는 없습니다 비동기 적으로 기능하거나이 블록에 대해 다른 아키텍처를 고안해보십시오. 그것이 async 함수 내에서 직접하지 않은 경우 당신이 await를 사용할 수 없기 때문에, 당신이 상상하는대로이 작업을 수행 할 수 https://github.com/MylesBorins/proposal-top-level-await

+0

감사합니다. upvoted하지만 코드가 빈 객체 (예 :'[{}, {}]')로 배열을 반환합니다. 나는 어딘가에'await'을 포함시킬 필요가 있다고 생각하지만 어디서 깨닫지 못했습니다. – MyTitle

+0

'service.getByValue' 함수는 어떻게 생겼습니까? – helb

+0

그것은 단지 ES6를 반환합니다 Promise – MyTitle