English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS базовый учебник

NodeJS Express.js

NodeJS буфер & URL;

NodeJS MySql

NodeJS MongoDB

NodeJS файл (FS)

Другие NodeJS

Функции вызова回调 Node.js

Каллбэк-функция Node.jsАсинхронность - это один из основных факторов, делающих Node.js популярным. Кallback - это реализация асинхронности функции. В общем, в Node.js большинство функций обработки ресурсов имеют вариант с callback.

Когда ресурс вызывается для выполнения задачи某个 асинхронной функции, контроллер немедленно продолжает выполнять следующие инструкции функции после этой функции. Задачи на ресурсе запускаются параллельно. Это может помочь Node.js продолжает выполнять другие задачи, в то время как функция использует этот ресурс.Как только задача по использованию ресурса завершится, Node.js использует回调-функцию для восстановления. Вызов Функция каллбэк имеет параметры: объект данных, объект результата и (или) объект ошибки, содержащий информацию о задаче.

Блокирующая функция:В противоположность асинхронным функциям, синхронные функции выполняются блоком, до тех пор, пока ресурс не будет завершен. Поэтому синхронные функции также называются блокирующими функциями.

Вложенные каллбэки Node.js : Если необходимо выполнить несколько операций над ресурсом по порядку и асинхронно, можно вложить каллбэки друг в друга.

Теперь, когда мы читаем файл (ресурс), мы увидим три случая, сравнивающие каллбэки с блокирующими функциями.

  • Пример блокирующей функции Node.js

  • Пример каллбэка Node.js

  • Node.js嵌套回调函数示例

Пример блокирующей функции

Вот пример скрипта Node.js, который синхронно читает файл sample.txt.

 var fs = require('fs'); 
 
// Чтение файла sample.txt
var data = fs.readFileSync('sample.txt'); 
console.log("Чтение файла завершено: " + new Date().toISOString()); 
 
console.log("After readFileSync statement: " + new Date().toISOString());

当上述程序运行时

终端输出

 arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-sync.js 
Чтение файла завершено: 2017-10-19T12:21:40.103Z
After readFileSync statement: 2017-10-19T12:21:40.105Z

after readFileSync всегда выполняется после завершения чтения файла. fs.readFileSync блокирует поток выполнения.

Пример каллбэка Node.js

Вот пример скрипта Node.js, который используетКаллбэк-функция Node.jsАсинхронное чтение файла sample.txt.

 var fs = require('fs'); 
 
// Чтение файла sample.txt
fs.readFile('sample.txt', 
    // Функция вызывается при завершении чтения файла
    function(err, data) {  
        if (err) throw err; 
        // Данные представляют собой буфер, содержащий содержимое файла
        console.log("Чтение файла завершено: " + new Date().toISOString()); 
 }); 
 
console.log("После асинхронного чтения файла: " + new Date().toISOString());

当上述程序运行时

终端输出

arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-async.js 
在异步读取文件后:2017-10-19T12:25:36.982Z
文件读取完成:2017-10-19T12:25:36.987Z

您可能会注意到,即使在执行console.log在readFile异步语句之后,完成对文件的读取也需要大约5毫秒。file. fs.readFile('sample.txt', callback function{..})没有阻塞执行,而是与主控制流并行启动一个新进程,以读取文件(对资源执行任务)。

Node.js嵌套回调函数示例

为了演示Node.js嵌套回调函数,我们将考虑重命名文件然后使用异步函数将其删除的方案。

 var fs = require('fs'); 
 
fs.rename('sample.txt', 'sample_old.txt', 
    // 第一次回调功能
    function (err) { 
        if (err) throw err; 
        console.log('文件已重命名.'); 
        fs.unlink('sample_old.txt', 
            // 第二次回调功能
            function (err) { 
                if (err) throw err; 
                console.log('文件已删除.'); 
            } 
        );  
    } 
 );

当上述Node.js示例与node一起运行时

终端输出

 arjun@arjun-VPCEH26EN:~/nodejs$ node nodejs-nested-callback.js 
文件已重命名。 
文件已删除。

结论:

在本Node.js教程– Node.js回调函数中,我们学习了回调函数的执行流程以及它们如何实现非阻塞,以及如何将嵌套回调函数与示例结合使用。