什么是函数(错误,结果){在下面?

时间:2017-03-17 06:41:23

标签: node.js lambda

我从nodejs开始,并在回调上阅读基础知识,这里我有一个代码,

 exports.handler = (event, context, callback) => {
    var bx = require('barcode-js');

    // Set default values.  
    var params = {
        input: './1.bmp',
        type: 'qrcode'
    };

    bx.analyze(params, function (err, results) {
    if (err) {
       callback('There was an error processing this image: ' + err)
    }
    results.forEach(function(result) {
        callback(null,'Result type :' + result.type + '\t'+'Value: '+result.value);
     });
});
};

此行中bx.analyze(params, function (err, results) {发生了什么。为什么我们不能只使用bx.analyze(params)?

3 个答案:

答案 0 :(得分:1)

这是使代码异步的回调函数。

表示您将函数作为参数传递给bx.analyze(params)方法。这个回调方法在bx.analyze(params)完成后执行,因此它不会阻塞其他代码,使代码异步。

如果您需要执行此回叫的方式,那么您必须查找Event loop,在Google中搜索,有大量文档。

答案 1 :(得分:1)

如果我们使用bx.analyze(params)那么它就是阻塞(同步)代码。事件循环停止,直到bx.analyze(params)没有返回任何值和

没有错误处理。

如果我们使用bx.analyze(params, function (err, results) { });则它是异步(非阻塞)代码。事件循环不会等待返回值,它会转到下一个语句,当bx.analyze(params, function (err, results) {返回回调事件循环时,它会处理它。

还有错误处理

如需深入了解,请参阅此视频https://www.youtube.com/watch?v=8aGhZQkoFbQ

答案 2 :(得分:1)

第二个参数是function。称为callback

执行异步功能时,不能等待其返回值:

var result = bx.analyze(params); //you can't do this

所以你告诉函数当它完成它的工作时,只需调用callback(你传递的函数作为第二个参数)。

//so `analyze()` will call your passed function rather than `return` the result
//`err` will contain the error object if anything wrong happened in the analyze() function
//`results` will contain result if everything was fine
bx.analyze(params, function (err, results) {
    if (err)
       callback('There was an error processing this image: ' + err)
});

我强烈建议您了解异步代码在javascript中的工作原理。直到那时你才能学习Nodej ..

<强>更新

在您的代码中,函数handler是一个异步函数,因此它需要callback作为参数(就像analyze()

当此功能完成其工作时,它会调用callback

现在在您的代码中,它被调用2次:

1)发生错误时,此函数将调用回调并将错误传递给它:

if (err) {
   callback('There was an error processing this image: ' + err); //its passing "err" returned from analyze()
}

2)当一切顺利时,它会通过结果集:

callback(null, 'Result type :' + result.type + '\t'+'Value: '+result.value); //the 1st parameter is being passed as "null" because there is no error in it, and second parameter passes the result