gpt4 book ai didi

javascript - 在 Javascript 中使用回调处理变量赋值?

转载 作者:行者123 更新时间:2023-12-02 14:38:31 25 4
gpt4 key购买 nike

我最近开始使用 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

最佳答案

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

var x = searchForProfessor("prof_name_here");

当您尝试记录它时,总会给您未定义

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

这是您的代码所发生情况的一个小模型,以及如何使用回调。

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

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

这里有您的 searchForProfessor 函数,它接受名称和函数。它使用名称调用 async1,并传入回调作为第二个参数。请注意,返回的data是从async1返回的对象数据。传递到 searchForProfessor 的回调用于将该数据返回到...

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

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

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

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

DEMO

关于javascript - 在 Javascript 中使用回调处理变量赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com