2016-11-22 4 views
1

JavaScript 약속과 약속 체인에 대한 이해가 부족합니다. 다음과 같은 방법이 있습니다. 그것은 첫째함수에서 약속 약속을 반환합니다.

반환

을 this.db.find, 나는 두 가지 수익을 가지고, 타이프 라이터이다 작성,하지만

private InsertPersonInDB(p : Person) {  
    return this.db.find({        //<- would this return? 
       selector: {objType: 'Person'}, 
       fields: ['_id'], 
       sort: ['_id'] 
      }).then(result => {       
       let allpersondIds : string[] = []; 
       (result.docs).forEach(rec => { 
        allpersondIds.push(rec._id); 
       }); 
       return allpersondIds;     
      }).then (allpersonIdsInDB => {     
       var id = this.getIdfromPersonName(person.personName, allpersonIdsInDB); 
       person._id = id; 
       return this.db.post(person)   //<- or would this return? 
      } 
} 

//Calling function 
for(let person of this.persons) { 
    InsertPersonInDB(person).then(result => { 
     console.log(result) 
     //Some UI updates  
    }).catch(err => { 
     console.log(err) 
     //Some UI updates notifying user about failure 
    }); 
} 

여기에 자바 스크립트 ES6에 맞게 수정할 수 있습니다에게 찾기 함수는 약속이다.

그리고 그 끝은

이다.

반환 this.db.post (사람)

포스트는 함수는 약속입니다. 여기

, 나는 세 가지 질문

1

)이 기능을 실행하면, 무엇을 반환 있나요?

2) 함수가 즉시 약속을 반환하면 체인 은 언제이 실행됩니까?

2) 계층화 된 응용 프로그램에서 약속 체인을 리팩토링하는 데 더 좋은 방법은 무엇입니까? 예 : 몇 가지 체인 다음 서비스에서 실행해야합니다, 다른 UI에서 실행해야합니다, 어떻게 내 약속 코드를 구조합니까?

답변

3

우선, 간단한 예제를 만들어 자신의 질문을 쉽게 테스트 할 수 있다고 생각합니다. 어떻게 작동하는지에 대해 잘 모를 때, 나는 무엇이 일어나는지를 시험하고보기 위해 작은 예제를 만드는 것이 매우 유용하다는 것을 알게되었습니다. 뿐만 아니라,이 질문에 대해이 작업을 수행 할 수 있습니다 (작업 버전도 https://plnkr.co/edit/K18o4Lp2jtUincjyG5wi?p=preview 참조, 결과를 볼 수있는 콘솔을 엽니 다!) :

function test() { 
    return returnPromise().then((value) => { 
    console.log('1st then, inside test(): ' + value); 
    return 'Hello'; 
    }).then((value) => { 
    console.log('2nd then, inside test(): ' + value); 
    return 'world'; 
    }); 
} 

function returnPromise() { 
    return new Promise(function(resolve, reject) { 
    resolve('start of new Promise'); 
    }); 
} 

test().then((value) => { 
    console.log('3rd then, after calling test: ' + value); 
}); 

당신의 질문 :

  1. 을 당신과 함께 약속을 반환 모든 연결된 then 기능. 반환 된 약속에 then을 추가하면 체인의 끝에 추가됩니다. 그것이 우리가 test().then(...) 일을 할 때 보는 것입니다.
  2. Promise는 어느 시점에서 알려주지 않고 실행한다는 것을 알려줍니다. Promise가 해결할 때마다 체인이 실행됩니다. 자세한 내용은 returnPromise에서 확인할 수 있습니다. 여기에 우리는 새로운 약속을 반환합니다.Promise의 본문은 완료되면 resolve 메서드를 호출하고 (이 경우 즉각적입니다.) Promise에 연결되어 모든 then 메서드를 확인하고 실행합니다. 일반적으로 약속은 즉시 해결되지 않지만 비동기 작업 (예 : 서버에서 데이터 검색)을 먼저 수행합니다.
  3. 정말 응용 프로그램의 유형과 찾고있는 내용에 따라 다릅니다. 책임이 명확하게 정의되어있는 한 현재의 접근 방식은 그다지 나쁘지 않습니다.
+0

귀하의 주장을 올바르게 이해하고 있는지 잘 모르겠습니다. 집행자는'function (resolve, reject)'부분이라고 나는 믿는다. 거기에는 return 문이 없습니다. 'resolve' 메소드 만 호출합니다. – Sjoerd

+1

당신이 무슨 뜻인지 아직도 모르므로 일하는 Plunker 예제를 주시겠습니까? '그때'를 사슬로 묶고 싶다면,'그때'에서 새로운 약속을 되 찾으세요. MDN 텍스트는 해결할 새로운 Promise를 구성하거나 모든 값을 리턴 할 수 있음을 설명합니다 (자동으로 약속으로 랩되고 해결됨). return 문을 두지 않으면 'then'에서 'then'까지 정보를 전달할 수 없습니다. – Sjoerd

+0

와우, 나는 당신이 "어떤 가치라도 돌려 줄 수 있다는 것을 몰랐다. (자동적으로 약속에 싸여 당신을 위해 해결할 것이다"). 너가 확실히 맞아. 내 혼란스러운 의견을 삭제하겠습니다. – ArneHugo

1

1) db.post(person) 요청의 결과로 해결되는 약속.

2) db.post() 호출이 응답을 반환하거나 예외를 throw하면 then(...)에 전달 된 콜백이 실행됩니다.

3) 알 수 없음. 나는 일반적인 대답이 있다고 생각하지 않는다. 이 서비스의 사용자에게 제공 할 API에 따라 다릅니다.

관련 문제