一尘不染

用Layman的术语理解异步代码

javascript

我了解异步性的基本知识:事物不会顺序执行。据我了解,这有很强大的功能。但是对于我的一生,我无法全神贯注于代码。让我们看一下我已经写过的异步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();
}

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


阅读 300

收藏
2020-05-01

共1个答案

一尘不染

我不确定在何处使用此函数,但回调的要点是您将它们传递给异步运行的某个函数。它存储了您的回调,当该函数完成需要执行的操作时,它将使用必要的参数 调用
回调。从前到后的示例可能是最好的。

假设我们有一个框架,其中有一个运行了很长时间的操作,该操作从数据库中获取了一些数据。

function getStuffFromDatabase() {
  // this takes a long time
};

由于我们不希望它同步运行,因此我们允许用户传递回调。

function getStuffFromDatabase(callback) {
  // this takes a long time
};

我们将模拟长时间调用setTimeout;我们还将假装我们从数据库中获得了一些数据,但是我们只是硬编码一个字符串值。

function getStuffFromDatabase(callback) {
  setTimeout(function() {
    var results = "database data";
  }, 5000);
};

最后,一旦有了数据,我们将 调用 框架函数用户提供给我们的回调。

function getStuffFromDatabase(callback) {
  setTimeout(function() {
    var results = "database data";
    callback(results);
  }, 5000);
};

作为框架的用户,您可以执行以下操作来使用该函数:

getStuffFromDatabase(function(data) {
  console.log("The database data is " + data);
});

所以,你可以看到data(同responsepostData在你的例子),从你通过回调函数来 ;
当它知道数据应该是什么时,它将把数据提供给您。

您无法在回调中设置值并无法在回调之外使用它的原因是,回调本身直到稍后才发生。

//  executed immediately  executed sometime in the future
//      |                  |       by getStuffFromDatabase
//      v                  v
getStuffFromDatabase(function(data) {
  var results = data; // <- this isn't available until sometime in the future!
});

console.log(results); // <- executed immediately

console.log运行时,的分配var results还没有发生!

2020-05-01