loadScript("/article/promise-chaining/one.js") .then(function(script) { return loadScript("/article/promise-chaining/two.js"); }) .then(function(script) { return loadScript("/article/promise-chaining/three.js"); }) .then(function(script) { // 불러온 스크립트 안에 정의된 함수를 호출해 // 실제로 스크립트들이 정상적으로 로드되었는지 확인합니다. one(); two(); three(); });
화살표 함수를 이용해서 줄이기
1 2 3 4 5 6 7 8 9
loadScript("/article/promise-chaining/one.js") .then(script => loadScript("/article/promise-chaining/two.js")) .then(script => loadScript("/article/promise-chaining/three.js")) .then(script => { // 스크립트를 정상적으로 불러왔기 때문에 스크립트 내의 함수를 호출할 수 있습니다. one(); two(); three(); });
thenable : .then 이라는 메서드를 가진 객체는 모두 thenable이라고 부른다. 핸들러는 모두 thenable객체를 반환한다고도 할 수 있다 이점을 활용해서 Promise를 상속받지 앋고도 커스텀 객체를 사용해 프라미스 체이닝을 만들 수 도 있다.
fetch와 체이닝 함께 응용하기
기본 문법
1
let promise = fecth(url);
해당 url로 요청을 보내고 응답을 기다리는 프라미스를 반화한다. 그런데 해당 프라미스는 응답이 완전히 완료 되기전에 이행상태가 되어버린다. fetch.text() 를 호출해서 테스트가 완전히 다운로드 되면 result 값으로 갖는 이행된 프라미스를 반환하게 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11
fetch('/example/user.json') // 원격 서버가 응답하면 .then 아래 코드가 실행됩니다. .then(function(response) { // response.text()는 응답 텍스트 전체가 다운로드되면 // 응답 텍스트를 새로운 이행 프라미스를 만들고, 이를 반환 return response.text() }) .then(function(text) { // 원격에서 받아온 파일의 내용 console.log(text); })
그러나 reponse.json()을 사용하면 json으로 파싱까지 할 수 있다.
1 2 3 4
// 위 코드와 동일한 기능을 하지만, response.json()은 원격 서버에서 불러온 내용을 JSON으로 변경해줍니다. fetch('/article/promise-chaining/user.json') .then(response => response.json()) .then(user => alert(user.name)); // iliakan, got user nam
// 콜백의 성공 결과를 담은 배열을 얻게 해주는 promisify(f, true) functionpromisify(f, manyArgs = false) { returnfunction (...args) { returnnewPromise((resolve, reject) => { functioncallback(err, ...results) { // f에 사용할 커스텀 콜백 if (err) { reject(err); } else { // manyArgs가 구체적으로 명시되었다면, 콜백의 성공 케이스와 함께 이행 상태가 됩니다. resolve(manyArgs ? results : results[0]); } }
unhandlerejection은 마이크로테스크 큐에 모든 작업이 완료 되면 트리거 된다. 엔진은 프라미스를 검사하고 하나라도 거부 상태이면 핸들러를 트리거 한다. .catch()역시 트리거 된다. 다만 .catch()는 unhandledrejection이 발생한 이후에 트리거 된다.