【问题标题】:Handling variable assignment using callbacks in Javascript? [duplicate]在Javascript中使用回调处理变量赋值? [复制]
【发布时间】:2016-09-10 08:04:25
【问题描述】:

我最近拿起了 Node,发现事情并不总是按顺序运行。我很困惑,因为我已经习惯了

1) Assignment
2) Print data 

当前我正在运行以下函数并调用var x = searchForProfessor("prof_name_here");

然后我打电话给console.log(x); 只是为了得到未定义。

我一直在网上阅读有关回调的信息,但我无法完全理解这个想法并将其应用到这段代码中。有人可以给我一些直觉,通过回调使上述成为可能吗?

我的功能

var searchForProfessor = function searchForProfessor(teacher_name) {

  google.resultsPerPage = 10
  var nextCounter = 0

  google(teacher_name, function (err, res){

    for (var i = 0; i < res.links.length; ++i) {
      var link = res.links[i];
      if (!link.title.includes('Add') || !link.title.includes('RATINGS') || !link.title.includes("Hint")) {

        request(link, function(err, resp, body){

          if (!err && resp.statusCode == 200) { //If no error is going to happen, then print the data
            var $ = cheerio.load(body);         //Grab the body of data from 'prof_link'
            var overall_rating = $('.breakdown-header .grade').text(); //Get the grade rating from the following classifications text

            if (overall_rating.substr(0,3)) {
              teacher_results.push(prof_name);
            } //End if
          } //End if
        }); //End request
      }//End if for comparisons ||
    } //End For
  }); //End google function
} //End searchForProfessor

【问题讨论】:

    标签: javascript asynchronous callback


    【解决方案1】:

    因为您的googlerequest 函数都是从这些函数返回的异步数据不会立即可用,这就是x 的原因

    var x = searchForProfessor("prof_name_here");
    

    当您尝试登录时,总会给您undefined

    为了缓解这个问题,您可以将函数作为参数传递给其他函数,以便在数据可用时返回该数据。

    这是一个小模型,展示了您的代码所发生的情况以及回调的使用方式。

    async1 模拟数据库连接 - 它使用键 1 秒后返回一个对象,方法是调用传递给它的函数,并将数据作为 its 第一个参数.

    function async1(name, callback) {
      var obj = { tea001: { first: 'Dave', last: 'Batman' } };
      setTimeout(function () {
        callback(obj[name]);
      }, 1000);
    }
    

    这里有你的searchForProfessor 函数,它接受一个名称和一个函数。它使用名称调用async1,并将回调作为第二个参数传入。注意返回的dataasync1返回的对象数据。传入searchForProfessor 的回调用于将该数据返回给...

    function searchForProfessor(teacher_name, callback) {
      async1(teacher_name, function (data) {
        callback(data);
      });
    }
    

    ...此函数调用searchForProfessor,此时您可以记录数据。

    searchForProfessor('tea001', function (data) {
      console.log(data);
    });
    

    您可以在演示中看到,一旦代码运行,返回的数据大约需要一秒钟才能记录到控制台。

    DEMO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2016-03-26
      • 2014-10-27
      • 1970-01-01
      相关资源
      最近更新 更多