Что такое cb() в Node?

Где люди, получающие cb(), это вещь Node или вещь Vanilla JS?

Например:

Управление Node.js Обратный звонок с Promises, генераторами и другими подходы

они используют cb() для того, чтобы угадать обратный вызов и вернуть ошибку или значение или оба в некоторых случаях в зависимости от того, что означает функция обратного вызова sig?

Ответ 1

cb в контексте, который вы описываете, так это то, как функция обратного вызова ваниля передается в (как правило) асинхронную функцию, которая является общим шаблоном в node.js(иногда это обозначается следующим образом, но вы можете назовите его bananas, если вы этого желаете - это просто аргумент).

Обычно первый аргумент - это объект error (часто false - если все идет по плану), а последующие аргументы - это данные определенной формы.

Например:

function myAsyncFunction(arg1, arg2, cb) {
    // async things
    cb(false, { data: 123 });
}

используя эту функцию:

myAsyncFunction(10, 99, function onComplete(error, data) {
    if (!error) {
        // hooray, everything went as planned
    } else {
        // disaster - retry / respond with an error etc
    }
});

Promises являются альтернативой этому шаблону проектирования, в котором вы вернете объект Promise из myAsyncFunction

Например:

function myAsyncFunction2(arg1, arg2) {
    return new Promise(function resolution(resolve, reject, {
        // async things
        resolve({ data: 123 });
    });
}

используя эту функцию:

myAsyncFunction2(10, 99)
    .then(function onSuccess(data) {
        // success - send a 200 code etc
    })
    .catch(function onError(error) {
        // oh noes - 500
    });

Они в основном то же самое, просто написано немного по-другому. Promises не поддерживаются особенно широко в родной форме, но если вы переносите транспилер (я бы рекомендовал babel) во время шага сборки, они должны выполняться достаточно надежно в браузере.

Обратные вызовы всегда будут работать в браузере без shimming/transpilation.

Ответ 2

node.js имеет множество асинхронных операций, которые выполняют обратный вызов завершения в качестве аргумента. Это очень распространено в различных API node.js.

Соглашение node.js для этого обратного вызова состоит в том, что первым аргументом, переданным обратному вызову, является код ошибки. Значение false для этого первого аргумента означает, что ошибки нет.

Например:

fs.readFile("test.txt", function(err, data) {
    if (!err) {
        console.log("file data is: " + data);
    }
});

Функция, которую вы создаете самостоятельно, также может определять ее собственный обратный вызов, чтобы сообщать о завершении одной или нескольких асинхронных операций.

function getData(id, cb) {
    var fname = "datafile-" + id + ".txt";
    fs.readFile(fname, function(err, data) {
        if (err) {
            cb(err);
        } else if (data.slice(0, 6) !== "Header"){
            // proper header not found at beginning of file data
            cb(new Error("Invalid header"));
        } else {
            cb(0, data);
        }
    });
}

// usage:
getData(29, function(err, data) {
    if (!err) {
        console.log(data);
    }
});