어느 누구에게 nodeJs 콜백의 간단한 예를 줄 수 있습니까? 이미 많은 웹 사이트에서 동일한 것을 검색했지만 제대로 이해할 수 없습니다. 간단한 예를 들어주세요.
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
그런 걸하고 싶어요 ...
어느 누구에게 nodeJs 콜백의 간단한 예를 줄 수 있습니까? 이미 많은 웹 사이트에서 동일한 것을 검색했지만 제대로 이해할 수 없습니다. 간단한 예를 들어주세요.
getDbFiles(store, function(files){
getCdnFiles(store, function(files){
})
})
그런 걸하고 싶어요 ...
답변:
var myCallback = function(data) {
console.log('got data: '+data);
};
var usingItNow = function(callback) {
callback('get it?');
};
이제 노드 또는 브라우저 콘솔을 열고 위의 정의를 붙여 넣으십시오.
마지막으로 다음 줄과 함께 사용하십시오.
usingItNow(myCallback);
노드 스타일 오류 규칙과 관련하여
Costa는 노드 오류 콜백 규칙을 준수하면 어떻게 될지 물었습니다.
이 규칙에서 콜백은 첫 번째 인수 인 하나 이상의 인수를 오류로 수신해야합니다. 선택적으로 컨텍스트에 따라 하나 이상의 추가 인수가 있습니다. 이 경우 컨텍스트는 위의 예입니다.
여기서는이 규칙에서 예제를 다시 작성합니다.
var myCallback = function(err, data) {
if (err) throw err; // Check for the error and throw if it exists.
console.log('got data: '+data); // Otherwise proceed as usual.
};
var usingItNow = function(callback) {
callback(null, 'get it?'); // I dont want to throw an error, so I pass null for the error argument
};
오류 사례를 시뮬레이션하려면 다음과 같이 usingItNow를 정의 할 수 있습니다.
var usingItNow = function(callback) {
var myError = new Error('My custom error!');
callback(myError, 'get it?'); // I send my error as the first argument.
};
최종 사용법은 위와 동일합니다.
usingItNow(myCallback);
동작의 유일한 차이점 usingItNow
은 정의한 버전에 따라 달라집니다. 첫 번째 인수에 대한 콜백에 "진정한 값"(Error 객체)을 제공하는 버전 또는 오류 인수에 대해 null을 제공하는 버전입니다. .
콜백 함수는 단순히 함수가 나중에 호출 할 수 있도록 다른 함수에 전달하는 함수입니다. 이것은 일반적으로 비동기 API 에서 볼 수 있습니다 . API 호출은 비동기식이므로 즉시 반환되므로 API가 비동기 작업 수행을 완료했을 때 호출 할 수있는 함수를 전달합니다.
JavaScript에서 생각할 수있는 가장 간단한 예는 setTimeout()
함수입니다. 두 개의 인수를받는 전역 함수입니다. 첫 번째 인수는 콜백 함수이고 두 번째 인수는 밀리 초 단위의 지연입니다. 이 함수는 적절한 시간 동안 기다린 다음 콜백 함수를 호출하도록 설계되었습니다.
setTimeout(function () {
console.log("10 seconds later...");
}, 10000);
이전에 위의 코드를 본 적이 있을지 모르지만 전달하는 함수가 콜백 함수라는 것을 깨닫지 못했습니다. 더 명확하게하기 위해 위의 코드를 다시 작성할 수 있습니다.
var callback = function () {
console.log("10 seconds later...");
};
setTimeout(callback, 10000);
콜백은 Node가하는 모든 작업에서 처음부터 비동기식으로 구축되기 때문에 Node의 모든 곳에서 사용됩니다. 파일 시스템과 대화 할 때에도. 이것이 바로 수많은 내부 Node API가 변수에 할당 할 수있는 데이터를 반환하는 대신 콜백 함수를 인수로 받아들이는 이유입니다. 대신 콜백 함수를 호출하여 원하는 데이터를 인수로 전달합니다. 예를 들어, Node의 fs
라이브러리를 사용 하여 파일을 읽을 수 있습니다. fs
모듈은 두 개의 고유 한 API의 기능을 표시합니다 : readFile
및readFileSync
.
이 readFile
함수는 비동기식이지만 readFileSync
분명히 그렇지 않습니다. 당신은 그들이 당신이 그들을 호출하기 때문에 가능하면 비동기 호출을 사용하려는 것을 볼 수 readFile
및 readFileSync
대신 readFile
과 readFileAsync
. 다음은 두 기능을 모두 사용하는 예입니다.
동기식 :
var data = fs.readFileSync('test.txt');
console.log(data);
위의 코드는의 모든 내용 test.txt
을 메모리로 읽어 변수에 저장할 때까지 스레드 실행을 차단 합니다 data
. 노드에서 이것은 일반적으로 나쁜 습관으로 간주됩니다. 간단하지만 지루한 작업을 수행하기 위해 간단한 스크립트를 작성하고 가능한 한 나노초마다 시간을 절약하는 데별로 신경 쓰지 않는 경우처럼 유용 할 때가 있습니다.
비동기 (콜백 포함) :
var callback = function (err, data) {
if (err) return console.error(err);
console.log(data);
};
fs.readFile('test.txt', callback);
처음에 우리는 두 개의 인수를 받아들이는 콜백 함수 작성 err
및 data
. 비동기 함수의 한 가지 문제는 오류를 포착하기가 더 어려워 져 많은 콜백 스타일 API가 콜백 함수의 첫 번째 인수로 오류를 전달한다는 것입니다. err
다른 작업을 수행하기 전에 값이 있는지 확인하는 것이 가장 좋습니다 . 그렇다면 콜백 실행을 중지하고 오류를 기록하십시오.
동기 호출은 예외가 발생했을 때 try/catch
블록으로 간단히 포착 할 수 있기 때문에 이점이 있습니다 .
try {
var data = fs.readFileSync('test.txt');
console.log(data);
} catch (err) {
console.error(err);
}
비동기 함수에서는 그렇게 작동하지 않습니다. API 호출이 즉시 반환되므로 try/catch
. 콜백을 사용하는 적절한 비동기 API는 항상 자체 오류를 포착 한 다음 적절하다고 판단되는대로 처리 할 수있는 콜백에 해당 오류를 전달합니다.
콜백 외에도 일반적으로 사용되는 프라 미스라고하는 또 다른 인기있는 API 스타일이 있습니다. 그들에 대해 읽고 싶다면 여기 에서이 답변을 기반으로 작성한 전체 블로그 게시물을 읽을 수 있습니다 .
여기에 텍스트 파일을 복사하는 예입니다 fs.readFile
과 fs.writeFile
:
var fs = require('fs');
var copyFile = function(source, destination, next) {
// we should read source file first
fs.readFile(source, function(err, data) {
if (err) return next(err); // error occurred
// now we can write data to destination file
fs.writeFile(destination, data, next);
});
};
그리고 이것이 copyFile
함수 사용의 예입니다 .
copyFile('foo.txt', 'bar.txt', function(err) {
if (err) {
// either fs.readFile or fs.writeFile returned an error
console.log(err.stack || err);
} else {
console.log('Success!');
}
});
일반적인 node.js 패턴은 콜백 함수의 첫 번째 인수가 오류임을 나타냅니다. 모든 제어 흐름 모듈이이 패턴에 의존하기 때문에이 패턴을 사용해야합니다.
next(new Error('I cannot do it!')); // error
next(null, results); // no error occurred, return result
const fs = require('fs');
fs.stat('input.txt', function (err, stats) {
if(err){
console.log(err);
} else {
console.log(stats);
console.log('Completed Reading File');
}
});
'fs'는 파일 읽기를 도와주는 노드 모듈입니다. 콜백 함수는 'input.txt'라는 파일이 실행되기 전에 완전히 읽혀 졌는지 확인합니다. fs.stat () 함수는 파일 크기, 생성 날짜 및 수정 날짜와 같은 파일 정보를 가져 오는 것입니다.
이 블로그 게시물에는 좋은 글이 있습니다.
https://codeburst.io/javascript-what-the-heck-is-a-callback-aba4da2deced
function doHomework(subject, callback) {
alert(`Starting my ${subject} homework.`);
callback();
}
function alertFinished(){
alert('Finished my homework');
}
doHomework('math', alertFinished);