为了账号安全,请及时绑定邮箱和手机立即绑定

用Layman的术语理解异步代码

用Layman的术语理解异步代码

慕妹3242003 2019-10-11 10:32:22
我了解有关异步性的基本知识:事物不会顺序执行。据我了解,这有很强大的功能。但是对于我的一生,我无法全神贯注于代码。让我们看一下我已经写过的异步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();}响应又从何而来?发布数据?为什么不能在此“回调”中定义变量,然后在回调之外使用它?有没有一种方法可以让一些东西具有顺序性,然后使程序的其余部分异步?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

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


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


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(同response和postData在你的例子),从你通过回调函数来成 ; 当它知道数据应该是什么时,它将把数据提供给您。


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


//  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还没有发生!


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 579 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信