不理解新函数的参数作为参数

时间:2017-03-04 20:00:14

标签: javascript

我正在按照教程制作图片上传系统。

现在使用以下功能进行上传,它使用外部模块强大

function upload(response, request) {
  console.log("Request handler 'upload' was called.");

  var form = new formidable.IncomingForm();
  console.log("about to parse");
  form.parse(request, function(error, fields, files) {
    console.log("parsing done");

    fs.rename(files.upload.path, "/tmp/test.png",
      function(error) {
        if (error) {
          fs.unlink("/tmp/test.png");
          fs.rename(files.upload.path, "/tmp/test.png");
        }
      });
      response.writeHead(200, {"Content-Type": "text/html"});
      response.write("received image:<br/>");
      response.write("<img src='/show' />");
      response.end();
  });
}

form.parse需要2个参数,请求新函数,但新函数需要3个新参数。

我似乎无法理解它。这三个新论点来自哪里?它与外部库有关,还是我不能正确理解JavaScript?

提前致谢。

3 个答案:

答案 0 :(得分:2)

form.parse取2个args,第二个arg是名为callback的函数。回调从form.parse实现获取参数。

让我们解释一下更简单的例子:

function foo(callback) {
    var arg1 = 10;
    var arg2 = 'string';
    var arg3 = false;

    // call function with args
    callback(arg1, arg2, arg3);
};


function callback(num, str, bool) {
    // we get args from foo implementation
    console.log(num);
    console.log(str);
    console.log(bool);
}

foo(callback);

foo代码中,我们使用3个args调用callback。现在我们可以在callback函数

中使用它们

答案 1 :(得分:1)

考虑到这一点的方法是form.parse采用两个参数 - 第一个由请求指示,第二个指示函数。第二个函数作为参数传递给form.parse,以便某个时候该函数可以调用它。

你可能会更清楚地看到它是这样写的(它是相同的,但可以说,更清晰):

function upload(response, request) {
  console.log("Request handler 'upload' was called.");
  var process_request = function(error, fields, files) {
    console.log("parsing done");

    fs.rename(files.upload.path, "/tmp/test.png",
      function(error) {
        if (error) {
          fs.unlink("/tmp/test.png");
          fs.rename(files.upload.path, "/tmp/test.png");
        }
      });
      response.writeHead(200, {"Content-Type": "text/html"});
      response.write("received image:<br/>");
      response.write("<img src='/show' />");
      response.end();
  };

  var form = new formidable.IncomingForm();
  console.log("about to parse");
  form.parse(request, process_request );
}

在这种情况下,我们宣布了一个函数process_request并将其传递给form.parse。它会被叫回来#34;在某个时候,通过该函数调用它(最有可能,但不能保证),在调用时会调用3个参数。

答案 2 :(得分:0)

第二个参数传递给form.parse方法,因为第二个参数是回调函数。在解析表单后,由form.parse调用它。回调函数的参数值来自form.parse方法。