javascript - 当 Meteor.method 内事件触发时返回值

标签 javascript node.js events meteor web-scraping

我正在尝试使用 node-image-scraper 包从网页中抓取一些图像,然后将图像数组返回到 Meteor 中的客户端。但是,考虑到包的事件驱动性质,我目前不知道这将如何工作。

var imageScraper = new imagescraper();
var images;

Meteor.methods({
    scrapeImgs(url){
        imageScraper.on('image', (image) => {
           images.push(image);
        });

        images = [];
        imageScraper.address = url;
        imageScraper.scrape();

        imageScraper.on('end', () => {
            return images; //does not work
        });

        return images; // returns an empty array
    },
});

从事件中返回图像不起作用,在外部返回图像会返回一个空数组。有什么办法可以让这个工作吗?或者说,鉴于目前的情况,这根本不可能?如果我需要将全套图像返回给客户端,该怎么做?

最佳答案

只需返回一个 promise :

Meteor.methods({
scrapeImgs(url){
    let images = []; // define vars
    imageScraper.on('image', (image) => {
       images.push(image);
    });

    imageScraper.address = url;
    imageScraper.scrape();

    return new Promise((resolve, reject) => {
        imageScraper.on('end', () => {
            resolve(images); // This will only trigger on end
            // Check end really triggers when expected
            // Don't use return on callbacks unless terminating explicitely
        });
        // Guessing it has an error event...
        imageScraper.on('error', (err) => {
            reject(new Meteor.Error(err));
            // Reject with Meteor.Error since these are caught and sanitized 
        })
    });
    // returns an empty array as array was populated on event callback, not on current process loop.
},
});

根据您的前端调用,您可以直接访问该值或访问 .then(),只需在前端检查:)

关于javascript - 当 Meteor.method 内事件触发时返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49217434/

相关文章:

javascript - 在 JS OOP 中创建一个类

javascript - jQuery 按类名排序

javascript - 将标签转换为输入文本

node.js - 余额转账示例的invoke-transaction.js中的交易ID响应有什么用?

node.js - 流利的 ffmpeg "not a suitable output format"

c# - 使用 EventArgs/EventArgs<T> 委托(delegate)类型而不是……的事件的好处

python - turtle 图形按键事件不重复

javascript - 获得意外的 token 导出

node.js - 无法让 AWS lambda 等待异步请求调用完成

mysql - 有没有办法提高 mysql 事件执行的性能?