상권's
TIL 8 (2021.10.14) 본문
Promise 실행함수가 가지고 있는 두 개의 파라미터 resolve 와 reject 는 각각 무엇을 의미하나요?
-> resolve는 정상적으로 작동 시 사용되며,
reject는 에러 발생 시 사용됩니다.
- 자세한 내용은 아래에서 알아보겠습니다.
resolve, reject함수에는 인자를 넘길 수 있습니다. 이때 넘기는 인자는 어떻게 사용할 수 있나요?
const getDataFromFilePromise = filePath => {
let options = {
encoding: 'utf8',
flag: 'r'
}
return new Promise ((resolve, reject) => {
fs.readFile(filePath, options, (err, data) => { // fs.readFile의 세번째 인자로 함수를 받게 되는데,
if(err) { // 만약 에러라면
reject(err) // reject를 통해서 err를 나타내고,
}
else { // 에러가 아니라면
resolve(data) // data를 전달한다.
}
})
})
// TODO: Promise 및 fs.readFile을 이용해 작성합니다.
};
new Promise()를 통해 생성한 Promise 인스턴스에는 어떤 메소드가 존재하나요? 각각은 어떤 용도인가요?
Promise.all()
Promise.all() 메서드는 순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 Promise를 반환합니다. 주어진 프로미스 중 하나가 거부하는 경우, 첫 번째로 거절한 프로미스의 이유를 사용해 자신도 거부합니다.
반환 값
매개변수로 주어진 순회 가능한 객체가 비어 있으면 이미 이행한 Promise.
객체에 프로미스가 없으면, 비동기적으로 이행하는 Promise. 단, 구글 크롬 58은 이미 이행한 프로미스를 반환합니다.
그렇지 않은 경우, 대기 중인 Promise. 결과로 반환하는 프로미스는 인자의 모든 프로미스가 이행하거나 어떤 프로미스가 거부할 때 (호출 스택이 비는 즉시) 비동기적으로 이행/거부합니다. "Promise.all의 동기성/비동기성" 예제를 참고하세요. 반환하는 프로미스의 이행 값은 매개변수로 주어진 프로미스의 순서와 일치하며, 완료 순서에 영향을 받지 않습니다.
Promise.race(iterable)
iterable 내의 어떤 프로미스가 이행하거나 거부하는 즉시 스스로 이행하거나 거부하는 프로미스를 반환합니다. 이행 값이나 거부 이유는 원 프로미스의 값이나 이유를 그대로 사용합니다. => 먼저 실행되거나 거부되는 프로미스를 반환한다.
Promise.reject()
주어진 이유로 거부하는 Promise 객체를 반환합니다.
Promise.resolve()
주어진 값으로 이행하는 Promise 객체를 반환합니다. 값이 then 가능한 (즉, then 메서드가 있는) 경우, 반환된 프로미스는 then 메서드를 따라가고 마지막 상태를 취합니다. 그렇지 않은 경우 반환된 프로미스는 주어진 값으로 이행합니다. 어떤 값이 프로미스인지 아닌지 알 수 없는 경우, Promise.resolve(value) 후 반환값을 프로미스로 처리할 수 있습니다.
Promise.prototype.then 메소드는 무엇을 리턴하나요?
.then() 메서드는 Promise (en-US)를 리턴하고 두 개의 콜백 함수를 인수로 받습니다. 하나는 Promise가 이행했을 때, 다른 하나는 거부했을 때를 위한 콜백 함수입니다.
p.then(onFulfilled, onRejected);
p.then(function(value) {
// 이행
}, function(reason) {
// 거부
});
Promise.prototype.catch 메소드는 무엇을 리턴하나요?
.catch()메서드는 Promise거부된 사례만 반환 하고 처리합니다.
Promise의 세 가지 상태는 각각 무엇이며, 어떤 의미를 가지나요?
대기(pending): 이행하거나 거부되지 않은 초기 상태.
이행(fulfilled): 연산이 성공적으로 완료됨.
거부(rejected): 연산이 실패함.
대기 중인 프로미스는 값과 함께 이행할 수도, 어떤 이유(오류)로 인해 거부될 수 있습니다. 이행이나 거부될 때, 프로미스에 연결한 처리기는 그 프로미스의 then 메서드에 의해 대기열에 오릅니다. 이미 이행했거나 거부된 프로미스에 연결한 처리기도 호출하므로, 비동기 연산과 처리기 연결 사이에 경합 조건은 없습니다.
await 키워드 다음에 등장하는 함수 실행은 어떤 타입을 리턴할 경우에만 의미가 있나요?
await 키워드를 사용할 경우, 어떤 값이 리턴되나요?
await연산자는 Promise를 기다리기 위해 사용됩니다. 연산자는 async function 내부에서만 사용할 수 있습니다.
[rv] = await expression;
expression - Promise 혹은 기다릴 어떤 값입니다.
rv - Promise에 의해 만족되는 값이 반환됩니다. Promise가 아닌 경우에는 그 값 자체가 반환됩니다.
bind() 메소드가 호출되면 새로운 함수를 생성합니다. 받게되는 첫 인자의 value로는 this 키워드를 설정하고, 이어지는 인자들은 바인드된 함수의 인수에 제공됩니다.
func.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg - 바인딩 함수가 대상 함수(target function)의 this에 전달하는 값입니다. 바인딩 함수를 new 연산자로 생성한 경우 무시됩니다. bind를 사용하여 setTimeout 내에 콜백 함수를 만들 때, thisArg로 전달된 원시 값은 객체로 변환됩니다. bind할 인수(argument)가 제공되지 않으면 실행 스코프 내의 this는 새로운 함수의 thisArg로 처리됩니다.
arg1, arg2, ... - 대상 함수의 인수 앞에 사용될 인수.
=> 정확한 사용 방법에 대해서는 학습을 한 후, 업데이트 하도록 하겠습니다.
fs.readFile(path[, options], callback)
path <string> | <Buffer> | <URL> | <integer> filename or file descriptor
메소드 fs.readFile 은 비동기적으로 파일 내용 전체를 읽습니다. 이 메소드를 실행할 때에는 인자 세 개를 넘길 수 있습니다.
path에는 파일 이름을 인자로 넘길 수 있습니다. 네 가지 종류의 타입을 넘길 수 있지만 일반적으로 문자열()의 타입으로 넘깁니다. ex) fs.readFile('/etc/passwd', ..., ...)
options <Object> | <string>
- encoding <string> | <null> Default: null => 'utf8' 로 해줌으로써 우리가 읽을 수 있는 형태가 된다.
- flag <string> See support of file system flags. Default: 'r'. => read '읽는 용도'
- signal <AbortSignal> allows aborting an in-progress readFile
대괄호로 감싼 두 번째 인자 options는 넣을 수도 있고, 넣지 않을 수도 있습니다.
대괄호는 선택적 인자를 의미합니다.
options는 객체 형태 또는 문자열로 넘길 수 있습니다. 문자열로 전달할 경우 인코딩을 넘깁니다.
callback <Function>
- err <Error>
- data <string> | <Buffer>
콜백 함수를 전달합니다. 파일을 읽고 난 후에 비동기적으로 실행되는 함수입니다.
콜백 함수에는 두 가지 파라미터가 존재합니다. 에러가 발생하지 않으면 err 는 null 이 되며, data 에 문자열이나 Buffer 라는 객체가 전달됩니다. data 는 파일의 내용입니다.
Callback Error Handling Design
인자를 callback으로 받을 때, 이 callback을 통해서 err 가 발생한 상황이거나, 정상적인 상황에 따른 데이터의 전달을 정할 수 있습니다. => callback 을 통해서 동기적으로 task를 처리할 수 있는데, 동기적으로 처리할 때, 상황에 따라서 callback 함수를 진행할 지 말지를 정할 수 있습니다.
let ishappen = (err, data) => {
if(err) {
callback(err, null)
}
else {
callback(null, data)
}
}
'~2022 작성 글 > TIL' 카테고리의 다른 글
TIL 10 코드 리뷰 (2021.10.08) (0) | 2021.10.16 |
---|---|
TIL 9 (2021.10.15) (0) | 2021.10.15 |
TIL 7 코드 리뷰 & 리팩토링 (2021.10.13) (0) | 2021.10.13 |
TIL 7 (2021.10.13) (0) | 2021.10.13 |
TIL 6 (2021.10.12) (0) | 2021.10.12 |