Node中的cb()是什么?

时间:2015-08-03 06:40:48

标签: node.js

人们从哪里获得cb(),这是一个Node事物还是vanilla事物?

例如:

Managing Node.js Callback Hell with Promises, Generators and Other Approaches

他们使用cb()来猜测回调并在某些情况下返回错误或值或两者,具体取决于回调函数sig是什么?

3 个答案:

答案 0 :(得分:34)

cb在你正在描述的上下文中是如何将一个vanilla回调函数传递给(通常)异步函数,这是node.js中的常见模式(有时候它是标记为下一个,但如果您愿意,可以将其称为bananas - 它只是一个参数。)

通常,第一个参数是error对象(通常是假的 - 如果一切都按计划进行),后续参数是某种形式的数据。

例如:

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

Promise是此设计模式的替代方案,您可以从myAsyncFunction返回Promise object

例如:

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

他们基本上是一回事,只是略有不同。以原生形式承诺aren't supported especially widely,但如果在构建步骤中通过转换器(我建议babel),它们应该在浏览器中足够可靠地执行。

回调将始终在没有填充/转换的浏览器中工作。

答案 1 :(得分:2)

node.js有许多异步操作,它们将完成回调作为参数。这在各种node.js API中非常常见。

此回调的node.js约定是传递给回调的第一个参数是错误代码。第一个参数的falsey值表示没有错误。

例如:

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

答案 2 :(得分:0)

从Vanilla JS中,您可以声明一个函数并将throuw参数传递给另一个函数的声明,该函数可以称为async

OpenSubKey() returns null for a registry key that I can see in regedit.exe