복붙노트

[NODEJS] 그것은 사용하는 비동기에 대한 안티 패턴 / await를 내 새로운 약속 () 생성자의인가?

NODEJS

그것은 사용하는 비동기에 대한 안티 패턴 / await를 내 새로운 약속 () 생성자의인가?

해결법


  1. 1.당신은 효과적으로 이렇게 약속 생성자 안티 패턴, 약속 생성자 실행 프로그램 함수 내에서 약속을 사용하고 있습니다.

    당신은 효과적으로 이렇게 약속 생성자 안티 패턴, 약속 생성자 실행 프로그램 함수 내에서 약속을 사용하고 있습니다.

    코드는 주요 위험의 좋은 예입니다 : 안전하게 모든 오류를 전파하지. 왜이 읽기.

    또한, 비동기의 사용 / await를 같은 트랩 더욱 놀라운 수 있습니다. 비교:

    하자 P = 새로운 약속 (해결 => { ''(); // 형식 오류 결의(); }); (비동기 () => { AWAIT P; }) () 캐치 (E => CONSOLE.LOG ( "잡". + E)); // 그것을 잡는 다.

    해당 비동기 (잘못된) 순진과 :

    하자 P = 새로운 약속 (비동기 해결 => { ''(); // 형식 오류 결의(); }); (비동기 () => { AWAIT P; }) () 캐치 (E => CONSOLE.LOG ( "잡". + E)); //이 그것을 잡을하지 않습니다!

    마지막에 브라우저의 웹 콘솔에서 봐.

    첫 번째 작품 약속 생성자 실행 프로그램 기능에 즉각적인 예외가 편리 새롭게 구축 약속을 거부하기 때문에 (그러나 어떤 안에 당신은 당신의 자신에있어 그 때는).

    비동기 기능에 즉각적인 예외가 비동기 함수 자체에 의해 반환 된 암시 적 약속을 거부하기 때문에 두 번째는 작동하지 않습니다.

    약속 생성자 실행 프로그램 기능의 반환 값이되지 않는 때문에, 그 나쁜 소식입니다!

    당신이 비동기로하여 myFunction를 정의 할 수 없습니다 이유가 없습니다 :

    async function myFunction() {
      let array = await getAsyncArray();
      return new Promise((resolve, reject) => {
        eachLimit(array, 500, (item, callback) => {
          // do other things that use native promises.
        }, error => {
          if (error) return reject(error);
          // resolve here passing the next value.
        });
      });
    }
    

    당신을 기다리고있을 때 왜 오래된 동시성 제어 라이브러리를 사용하지만?


  2. 2.나는 때때로 그것의 깔끔한 당신이 약속을 반환 체인 여러 작업하려는 특히, 약속 내부 비동기 가지고 있고 다음 (). 다음 () 지옥을 피하기 위해,보다 여전히 주어진 답변에 동의합니다. 그 상황에서 같은 것을 사용하는 것이 좋습니다 것입니다 :

    나는 때때로 그것의 깔끔한 당신이 약속을 반환 체인 여러 작업하려는 특히, 약속 내부 비동기 가지고 있고 다음 (). 다음 () 지옥을 피하기 위해,보다 여전히 주어진 답변에 동의합니다. 그 상황에서 같은 것을 사용하는 것이 좋습니다 것입니다 :

    const operation1 = Promise.resolve(5)
    const operation2 = Promise.resolve(15)
    const publishResult = () => Promise.reject(`Can't publish`)
    
    let p = new Promise((resolve, reject) => {
      (async () => {
        try {
          const op1 = await operation1;
          const op2 = await operation2;
    
          if (op2 == null) {
             throw new Error('Validation error');
          }
    
          const res = op1 + op2;
          const result = await publishResult(res);
          resolve(result)
        } catch (err) {
          reject(err)
        }
      })()
    });
    
    (async () => {
      await p;
    })().catch(e => console.log("Caught: " + e));
    

    단점의 생각은 시도 / 캐치를 넣고 그것을 거부 부착 기억해야한다는 것입니다.


  3. 3.

    static getPosts(){
        return new Promise( (resolve, reject) =>{
            try {
                const res =  axios.get(url);
                const data = res.data;
                resolve(
                    data.map(post => ({
                        ...post,
                        createdAt: new Date(post.createdAt)
                    }))
                )
            } catch (err) {
                reject(err);                
            }
        })
    }
    

    await를 제거하고 비동기이 문제를 해결합니다. 당신이 약속 개체를 적용했기 때문에, 그것으로 충분합니다.

  4. from https://stackoverflow.com/questions/43036229/is-it-an-anti-pattern-to-use-async-await-inside-of-a-new-promise-constructor by cc-by-sa and MIT license