복붙노트

[JQUERY] 어떻게 제대로 약속 체인의 탈옥?

JQUERY

어떻게 제대로 약속 체인의 탈옥?

해결법


  1. 1.첫째, 나는 그것이 더 나은 당신이 "우회"약속 체인보다는 "휴식"에 (의 일부) 그것을 추구라고 생각합니다.

    첫째, 나는 그것이 더 나은 당신이 "우회"약속 체인보다는 "휴식"에 (의 일부) 그것을 추구라고 생각합니다.

    당신이 말하는 것처럼, 여러 곳에서 "emptyResult"를 테스트하는 것은 매우 추한입니다. 약속 체인의 일부를 실행하지 않는 같은 일반적인 원칙을 준수하면서 다행히, 더 우아한 메커니즘을 사용할 수 있습니다.

    대안기구 나중에 체인에서 특정의 에러 조건 (들)을 재 - 검출 후, 흐름을 제어하도록 약속 거부를 사용하고 성공적인 경로에 다시 넣어이다.

    Menus.getCantinas().then(function(cantinas) {
        Menus.cantinas = cantinas;
        if(cantinas.length == 0) {
            return $.Deferred().reject(errMessages.noCantinas);
        } else {
            return $.when(Menus.getMeals(cantinas), Menus.getSides(cantinas));
        }
    }).then(function(meals, sides) {
        Menus.sides = sides;
        Menus.meals = meals;
        return Menus.getAdditives(meals, sides);
    }).then(function(additives) {
        Menus.additives = additives;
        return Menus;
    }).then(null, function(err) {
        //This "catch" exists solely to detect the noCantinas condition 
        //and put the chain back on the success path.
        //Any genuine error will be propagated as such.
        //Note: you will probably want a bit of safety here as err may not be passed and may not be a string.
        return (err == errMessages.noCantinas) ? $.when(Menus) : err;
    }).done(function(Menus) {
        // with no cantinas, or with everything
    });
    
    var errMessages = {
        'noCantinas': 'no cantinas'
    };
    

    플러스 측면에서, 나는 자연의 성공 경로의 가독성 중첩 차종의 부족을 찾을 수 있습니다. 또한, 나를 위해 적어도,이 패턴은 필요한 경우, 더 바이 패스를 수용하기 위해 최소한의 정신 저글링 필요합니다.

    아래쪽 측면에서,이 패턴은 BERGI의보다 약간 덜 효율적이다. 주 경로의 BERGI 상기 cantinas.length 같은 약속 수가 동일한 반면 == 0 경로는 하나 이상의 (또는 바이 패스 당 여러 우회 부호화 된 경우)를 필요로한다. 따라서 errMessages 객체 - - 일부 detracts을 찾을 수있다 또한,이 패턴은 특정의 에러 조건 (들)의 신뢰성 재 검출이 필요하다.


  2. 2.당신 같은 소리는 휴식을하지 않는 지점에 원하는 - 당신이 완료에 평소와 같이 계속합니다. 약속의 좋은 숙박 시설에서는뿐만 아니라 체인을뿐만 아니라 중첩 및 제한없이 벗어난다 될 수 있다는 것이다. 귀하의 경우에, 당신은 당신이 떨어진 경우 문 안쪽에 "휴식"을 원하는 체인의 일부를 넣을 수 있습니다 :

    당신 같은 소리는 휴식을하지 않는 지점에 원하는 - 당신이 완료에 평소와 같이 계속합니다. 약속의 좋은 숙박 시설에서는뿐만 아니라 체인을뿐만 아니라 중첩 및 제한없이 벗어난다 될 수 있다는 것이다. 귀하의 경우에, 당신은 당신이 떨어진 경우 문 안쪽에 "휴식"을 원하는 체인의 일부를 넣을 수 있습니다 :

    Menus.getCantinas().then(function(cantinas) {
        Menus.cantinas = cantinas;
    
        if (cantinas.length == 0)
            return Menus; // break!
    
        // else
        return $.when(Menus.getMeals(cantinas), Menus.getSides(cantinas))
        .then(function(meals, sides) {
            Menus.sides = sides;
            Menus.meals = meals;
            return Menus.getAdditives(meals, sides);
        }).then(function(additives) {
            Menus.additives = additives;
            return Menus;
        });
    }).done(function(Menus) {
        // with no cantinas, or with everything
    });
    

  3. 3.브라우저 약속 내장하고는 체인 트리거 그럼 또는 어획량 또는 오류 (약속) catch되지 않은 던지고, 모든 소비자가 거부 사건에 대해 알고하지 않고 약속 체인을 중단하는 방법을 찾고, 당신은 다음을 사용할 수 있습니다 사용하는 사람들을 위해 :

    브라우저 약속 내장하고는 체인 트리거 그럼 또는 어획량 또는 오류 (약속) catch되지 않은 던지고, 모든 소비자가 거부 사건에 대해 알고하지 않고 약속 체인을 중단하는 방법을 찾고, 당신은 다음을 사용할 수 있습니다 사용하는 사람들을 위해 :

    var noopPromise = {
      then: () => noopPromise, 
      catch: () => noopPromise
    }
    
    function haltPromiseChain(promise) {
      promise.catch(noop)
    
      return noopPromise
    }
    
    // Use it thus:
    var p = Promise.reject("some error")
    p = haltPromiseChain(p)
    p.catch(e => console.log(e)) // this never happens
    

    기본적으로, noopPromise는 체인 기능을합니다 약속 인터페이스 밖으로 기본 스텁이지만, 어떤을 실행하지 않습니다. 이것은 뭔가 YMMV 그래서 (내가 크롬 57.0.2987.98이 테스트), 약속의 경우 오리 타이핑 분명히 브라우저 사용을 결정하기 위해,하지만이 문제가 될 경우 당신은 아마 실제 약속 인스턴스와 중성을 만들 수 있다는 사실에 의존 그 다음과 캐치 방법.

  4. from https://stackoverflow.com/questions/29499582/how-to-properly-break-out-of-a-promise-chain by cc-by-sa and MIT license