【问题标题】:Why is this funciton not loading right first in Node.JS?为什么这个函数没有在 Node.JS 中首先加载?
【发布时间】:2016-05-16 17:58:47
【问题描述】:

我正在用 Node.JS 编写一个 twitter 机器人,但我有一个使用名为“scrapejs”的 npm 库的函数,它从 yahoo Finance 获取数据并且工作正常,问题是虽然我在加载函数之后底部的代码首先运行,而不是为什么。我之前有我的机器人的推文部分工作,但如果我从网络抓取中抓取数据,我不能在推文之后运行它。

代码如下:

console.log("The Bot Is Starting To Work.");

var sp = require('scrapejs').init({
    cc: 2, // up to 2 concurrent requests
    delay: 5 * 1 // delay .05 seconds before each request
});

sp.load('https://ca.finance.yahoo.com/q?s=CADUSD=X')
    .then(function ($, res) {
        //$.q("//h3[@class='r']/a").forEach(function(node){ //Adding the HTML Tags to filter the data
        console.log("Scraping The Web...");
        $.q("//span[@class='time_rtq_ticker']/span").forEach(function (node) {
            var res = {
                title: node.textContent //Always returns { title: 'NUMBER'} (When Working)
            }
            console.log(res);
            return res;
        })
    })
    .fail(function (err) {
        console.log(err);
    })


console.log("Why does this part load first??"); // This part comes first before the function above

输出如下:https://imgur.com/YJD2FUW

【问题讨论】:

    标签: javascript node.js twitter bots


    【解决方案1】:

    node.js 异步工作,这意味着您的代码中的行开始一个接一个,并且每一行都在结束时结束-第三行不会等待 让第二个在开始前完成。

    由于你的第二个函数很重,它需要一些时间来运行,不仅仅是一个简单的console.log(),最后一行将首先结束

    【讨论】:

    • 我现在使用 setTimeout 函数使其正常工作,在整理完所有其他工作后,我将制定更好的解决方案。谢谢!
    • @CorgJR - 通常当您希望在某个其他函数之后发生某些事情时,您会将其放入函数的回调中。超时的问题是您在那里使用了一些任意时间 - 在某些情况下您会等待太久,在其他情况下时间可能不够
    【解决方案2】:

    为了让您的生活更轻松,您可以使用deasync 模块。

    https://github.com/abbr/deasync

    • 只需安装它使用:npm i -s deasync

    然后您可以将任何异步函数转换为同步函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2017-05-19
      • 2011-01-06
      • 2013-03-25
      • 1970-01-01
      • 2020-01-01
      • 2021-05-17
      相关资源
      最近更新 更多