2017-03-04 9 views
3

イメージのアップロードシステムを作成するチュートリアルに従っています。引数として新しい関数の引数を理解していない

ここで、次の機能をアップロードするために使用され、それがform.parseは2つの引数、要求新機能かかりますが、新しい関数が取る手ごわい

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

外部モジュールを使用しています3つの新しい議論。

私はそれを理解できないようです。これら3つの新しい議論はどこから来たのですか?外部のライブラリとやり取りしているのですかJavaScriptを正しく理解していませんか?

ありがとうございます。

+0

これは、外部ライブラリによって予期されるコールバック関数です。あなたは本当にJSの基礎について読んでください。 http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/そして、 '' parse''関数を実装しているFormidableのソースコードを探します。 – tiblu

答えて

2

form.parse 2つ目の引数は、callbackという関数です。コールバックはform.parseの実装から引数を受け取ります。

は、より簡単な例で説明しましょう:fooコードで

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

我々は3つの引数でcallbackを呼び出します。今度はcallbackの機能で使用できます

0

2番目の引数としてform.parseメソッドに渡される2番目の引数は、コールバック関数です。これは、フォームが解析された後にform.parseによって呼び出されます。コールバック関数の引数の値は、form.parseメソッドから取得します。

1

この考え方は、form.parseが2つのパラメータをとります。最初は要求で、2番目は関数です。この2番目の関数は、ある時点でその関数によって呼び出されるように、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。その関数によってある時点で "コールバック"され、呼び出されたときに3つのパラメータで呼び出されます(保証されているとは限りません)。

関連する問題