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

javascript-Meteor.method内事件触发时返回值,javascript,node.js,events,meteor,web-scraping,Javascript,Node.js,Events,Meteor,Web Scraping,我正在尝试使用一个节点图像刮刀包从网页上刮取一些图像,然后将图像数组返回给Meteor中的客户端。然而,鉴于包的事件驱动性质,我目前不知道这将如何工作 var imageScraper = new imagescraper(); var images; Meteor.methods({ scrapeImgs(url){ imageScraper.on('image', (image) => { images.push(image);

我正在尝试使用一个节点图像刮刀包从网页上刮取一些图像,然后将图像数组返回给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
    },
});

从事件返回图像不起作用,在外部返回图像将返回空数组。有什么办法可以让这一切顺利进行吗?还是在这种情况下根本不可能?如果我需要将全套图像返回给客户端,该怎么办?

只需返回一个承诺:

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(),只需在前端检查:)

可能重复的。不幸的是,该问题从未得到回答。作者说,他联系了第三方脚本的作者,并向他提供了一个解决方案,但他从未分享过。问题是,您试图从异步函数返回,stackoverflow上有许多解决该问题的答案,如下所示:例如,在此处找到答案:可能重复