javascript - return 事件在 Meteor.method 内触发时的值
javascript - return value when event triggers within Meteor.method
我正在尝试使用 node-image-scraper 包从网页中抓取一些图像,然后 return 将图像数组发送到 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
},
});
从事件中返回图像不起作用,return在 return 外部的图像是一个空数组。有什么办法可以使这项工作?还是在这种情况下根本不可能?如果我需要 return 向客户提供全套图像,将如何完成?
只需return一个承诺:
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(),只需在前端检查一下:)
我正在尝试使用 node-image-scraper 包从网页中抓取一些图像,然后 return 将图像数组发送到 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
},
});
从事件中返回图像不起作用,return在 return 外部的图像是一个空数组。有什么办法可以使这项工作?还是在这种情况下根本不可能?如果我需要 return 向客户提供全套图像,将如何完成?
只需return一个承诺:
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(),只需在前端检查一下:)