猿问

用Layman的术语理解异步代码

我了解有关异步性的基本知识:事物不会顺序执行。据我了解,这有很强大的功能。但是对于我的一生,我无法全神贯注于代码。让我们看一下我已经写过的异步Node.JS代码...但是并没有真正得到。


function newuser(response, postData) {

    console.log("Request handler 'newuser' was called.");

    var body = '<html>' + 

        '<head>' +

        '<meta http-equiv="Content-Type" content="text/html; ' +

        'charset=UTF-8" />' +

        '</head>' +

        '<body>' +

        '<form action=" /thanks" method="post">' +

        '<h1> First Name </h1>' +

        '<textarea name="text" rows="1" cols="20"></textarea>' +

        '<h1> Last Name </h1>' +

        '<textarea name="text" rows="1" cols="20"></textarea>' +

        '<h1> Email </h1>' +

        '<textarea name="text" rows="1" cols="20"></textarea>' +

        '<input type="submit" value="Submit text" />' +

        '</body>' +

        '</html>';

    response.writeHead(200, { "Content-Type": "text/html" });

    response.write(body);

    response.end();

}

响应又从何而来?发布数据?为什么不能在此“回调”中定义变量,然后在回调之外使用它?有没有一种方法可以让一些东西具有顺序性,然后使程序的其余部分异步?


慕妹3242003
浏览 611回答 3
3回答

翻翻过去那场雪

我不确定在哪里使用该函数,但是回调的要点是您将它们传递给异步运行的某个函数。它存储了您的回调,当该函数完成需要执行的操作后,它将使用必要的参数调用回调。从前到后的示例可能是最好的。想象我们有一个框架,其中有一个运行了很长时间的操作,该操作从数据库中获取一些数据。function getStuffFromDatabase() {&nbsp; // this takes a long time};由于我们不希望它同步运行,因此我们将允许用户传递回调。function getStuffFromDatabase(callback) {&nbsp; // this takes a long time};我们将模拟长时间调用setTimeout;我们还将假装我们从数据库中获得了一些数据,但是我们只是硬编码一个字符串值。function getStuffFromDatabase(callback) {&nbsp; setTimeout(function() {&nbsp; &nbsp; var results = "database data";&nbsp; }, 5000);};最后,一旦有了数据,我们将调用框架函数用户给我们的回调。function getStuffFromDatabase(callback) {&nbsp; setTimeout(function() {&nbsp; &nbsp; var results = "database data";&nbsp; &nbsp; callback(results);&nbsp; }, 5000);};作为框架的用户,您可以执行以下操作来使用该函数:getStuffFromDatabase(function(data) {&nbsp; console.log("The database data is " + data);});所以,你可以看到data(同response和postData在你的例子),从你通过回调函数来成 ; 当它知道数据应该是什么时,它将把数据提供给您。您无法在回调中设置值并不能在回调之外使用它的原因是,回调本身直到稍后才发生。//&nbsp; executed immediately&nbsp; executed sometime in the future//&nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp;by getStuffFromDatabase//&nbsp; &nbsp; &nbsp; v&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; vgetStuffFromDatabase(function(data) {&nbsp; var results = data; // <- this isn't available until sometime in the future!});console.log(results); // <- executed immediately当console.log运行时,的分配var results还没有发生!
随时随地看视频慕课网APP
我要回答