我正在使用带有cheerio
的Node.js(Node.js上的jQuery模块)和fetch
(一个获取像request
这样的HTML主体的模块)来获取一些数据。网站并保存到MongoDB。
我可以在浏览器中选择像jQuery这样的元素
我必须得到一些data
并将data
传递给callback
函数,例如:
var data = "";
var fetchById = function(id, callback){
var data = $("#"+id).parent().siblings(".someClass").text().replace(/\s/g, ""); // line 3
callback(null, data);
};
然后......
fetchById(10987, function(err, data){
if(err){
// errorHandle(err);
}else{
// db.save(data);
}
});
但有时在第3行成功检索callback
之前调用了data
,因此,data
是一个空字符串""
如何确保在第3行完成后调用callback
?
答案 0 :(得分:0)
您可以通过显式排队来完成此操作。请参阅jQuery API。
例如(来自API):
$( "#foo" ).slideUp();
$( "#foo" ).queue(function() {
alert( "Animation complete." );
$( this ).dequeue();
});
这与首先执行.slideUp()
相同,然后作为回调执行alert()
。
至于你的代码,这会变成这样的东西:
var data = 0;
$("#some_element").queue("yourQueue", function() {
console.log("First");
// first function
data = $("#"+id).parent().siblings(".someClass").text().replace(/\s/g, "");
$(this).dequeue("yourQueue");
});
$("#some_element").queue("yourQueue", function() {
console.log("Second");
// second function
callback(null, data); // if callback() is a declared function, this should work
$(this).dequeue("yourQueue");
});
$("#some_element").dequeue("yourQueue");
我使用了此答案中的代码:How do I chain or queue custom functions using JQuery?
这里要注意的重要一点是,必须在相同的全局元素上调用.queue()
函数,以确保函数执行(显式)顺序。