如何等待一些jQuery方法完成?

时间:2014-11-25 17:52:55

标签: javascript jquery node.js

我正在使用带有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

1 个答案:

答案 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()函数,以确保函数执行(显式)顺序。