【问题标题】:How to wait until some jQuery methods are finished?如何等到一些 jQuery 方法完成?
【发布时间】:2014-11-25 17:52:55
【问题描述】:

我将 Node.js 与 cheerio(Node.js 上的 jQuery 模块)和 fetch(用于获取 HTML 正文的模块,如 request)一起从网站获取一些数据并保存到 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);
    }
});

但有时callback在第3行成功检索到data之前被调用,因此,data是一个空字符串""

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

【问题讨论】:

  • javascript runes 是线性的,它不应该在第 3 行完成之前运行 'callback',唯一的例外是异步调用,看起来不像这里的情况。
  • 我希望您已经这样做了,但我们必须确定...您是否检查过只有您的 fetchById 函数调用了 taht 回调?并且唯一的调用是由您当前正在调试的上下文进行的?
  • 在该回调中没有进行其他调用。如前所述,有时我通过 jQuery 方法成功获取数据,有时失败......所以我认为唯一的原因是,第 3 行每次调用需要不同的时间长度

标签: javascript jquery node.js


【解决方案1】:

您可以通过显式排队来完成此操作。见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() 函数必须在同一个全局元素上调用,以确保函数(显式)顺序执行。

【讨论】:

  • .queue() 方法对我有用!但我用 jQuery 切换到 jsdom 而不是 cheerio 正弦它没有 .queue() 方法
  • @WhyCode:好吧,如果您认为我回答了您的问题,请考虑接受。
猜你喜欢
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多