простий зворотний виклик nodeJs


120

хтось може надати мені простий приклад зворотних викликів nodeJs, я вже шукав те саме на багатьох веб-сайтах, але не можу його зрозуміти належним чином. Надайте, будь ласка, простий приклад.

getDbFiles(store, function(files){
    getCdnFiles(store, function(files){
    })
})

Я хочу зробити щось подібне ...


приклад того, як записати функцію, яка приймає зворотний виклик як аргумент?
Гнтем

так, щось подібне, будь-який простий приклад, який допомагає мені зрозуміти це.
Bhushan Goel

2
Зворотний виклик - це функція, яку ви передаєте як параметр іншій функції ... Google pls -> "javascript зворотного дзвінка" -> перший результат
Gabriel Llamas

Відповіді:


198
var myCallback = function(data) {
  console.log('got data: '+data);
};

var usingItNow = function(callback) {
  callback('get it?');
};

Тепер відкрийте вузол або консоль браузера та вставте вищевказані визначення.

Нарешті, скористайтеся цим наступним рядком:

usingItNow(myCallback);

З повагою до конвенцій про помилки у стилі вузла

Коста запитав, як це виглядатиме, якби ми вшанували правила зворотного виклику помилок вузла.

У цій умові зворотний виклик повинен очікувати отримання як мінімум одного аргументу, першого аргументу, як помилку. За бажанням у нас буде один або більше додаткових аргументів, залежно від контексту. У цьому випадку контекст - це наш вище приклад.

Ось я переписав наш приклад у цій конвенції.

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
};

Якщо ми хочемо моделювати випадок помилки, ми можемо визначити, використовуючиItNow, як це

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ви визначили: ту, яка подає "триєдне значення" (об'єкт Помилка) до зворотного виклику першого аргументу, або та, яка подає його, нульовим для аргументу помилки .


Отже, як це виглядає з помилкою як з конвенцією першого параметра?
Коста

113

Функція зворотного дзвінка - це просто функція, яку ви передаєте в іншу функцію, щоб ця функція могла викликати її пізніше. Це зазвичай спостерігається в асинхронних 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 побудований з нуля, щоб бути асинхронним у всьому, що він робить. Навіть під час розмови з файловою системою. Ось чому багато внутрішніх API вузлів приймають функції зворотного виклику як аргументи, а не повернення даних, які ви можете призначити змінній. Натомість він викликатиме вашу функцію зворотного дзвінка, передаючи дані, які ви хотіли в якості аргументу. Наприклад, ви можете використовувати fsбібліотеку Node для читання файлу. fsМодуль надає два унікальних функцій API: readFileі readFileSync.

readFileФункція є асинхронним в той часreadFileSync , очевидно , немає. Ви можете бачити, що вони мають намір використовувати виклики async, коли це можливо, оскільки вони дзвонили їм, 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, який зазвичай використовується під назвою обіцянка. Якщо ви хочете прочитати про них, ви можете прочитати всю публікацію в блозі, яку я написав на основі цієї відповіді тут .


3
досить детальна, але стисла концепція; для node.js для початківців, як я ...
kmonsoor

3
+1 для надання великої кількості контексту. Не тільки те, як виглядають функції зворотного виклику, але і якими вони є, чому вони використовуються та чому вони використовуються багато. Дуже корисно для початківця.
Azurespot

1
Чудово! це може бути посада сама по собі!
Пабло Гліз

1
Воно є , і воно включає другу частину про обіцянки;)
Шев

1
Це набагато краще пояснення, ніж прийнята відповідь! Я хотів би, щоб кожна прийнята відповідь тут на ТА була такою - не лише фрагмент коду, який вирішує проблему, але і ЧОМУ і ЯК вона вирішує проблему. В основному, ця відповідь і зворотний виклик дадуть вам досить чітке розуміння того, що таке зворотний виклик.
RusI

10

Ось приклад копіювання текстового файлу за допомогою 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

2
що далі? Що таке результати змінної = як називається?
Кочовий кодер

3
@SemicolonWarrier покажчик для мене, а також інші: stackoverflow.com/questions/5384526/javascript-node-js-next
kmonsoor

7

Спробуйте цей приклад настільки простий, як ви можете прочитати, просто скопіюйте зберегти newfile.js do node newfile для запуску програми.

function myNew(next){
    console.log("Im the one who initates callback");
    next("nope", "success");
}


myNew(function(err, res){
    console.log("I got back from callback",err, res);
});

3

ми створюємо просту функцію як

callBackFunction (data, function ( err, response ){
     console.log(response)
}) 

// callbackfunction 
function callBackFuntion (data, callback){
    //write your logic and return your result as
callback("",result) //if not error
callback(error, "") //if error
}

1
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 () полягає в отриманні інформації про файли, такі як розмір файлу, дата створення та зміна дати.


1

//delay callback function
function delay (seconds, callback){
    setTimeout(() =>{
      console.log('The long delay ended');
      callback('Task Complete');
    }, seconds*1000);
}
//Execute delay function
delay(1, res => {  
    console.log(res);  
})


0

A callback- функція, передана як параметр a Higher Order Function( wikipedia ). Проста реалізація зворотного дзвінка:

const func = callback => callback('Hello World!');

Щоб викликати функцію, просто передайте іншу функцію як аргумент визначеній функції.

func(string => console.log(string));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.