如何等到一些jQuery方法完成

How to wait until some jQuery methods are finished?

本文关键字:jQuery 方法      更新时间:2023-09-26

我正在使用Node.js与cheerio(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 行成功检索data之前调用callback,因此,data 是一个空字符串""

如何确保在第 3 行完成后调用callback

您可以通过显式排队来实现此目的。请参阅 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");

我在哪里使用了这个答案中的代码:如何使用 JQuery 链接或排队自定义函数?

这里需要注意的重要一点是,必须在同一个全局元素上调用.queue()函数,以确保函数(显式)顺序执行。