MeteorJS:在另一个异步函数中处理异步函数?

时间:2017-05-09 01:27:52

标签: javascript meteor ecmascript-6

所以,我在如何正确处理这个问题上失败了。

我想做的是:

// client side
Meteor.call("getData", url, function(images) {
  console.log(images); // get array of image src
});

// server side
Meteor.methods({
  "getData": (url) => {
      var images = [];
     // here is where I am lost
     // scrape the images
     scrape.request(url, function(err, $) {
       if (!err) {
          $('img').each(function(img) {
            let src = img.attribs.src;
            images.push(src);
          }
          // so at this point, I can console log an array on the server, but I need to bring it back to the client
       }
     } // now, how do I push all these and then signal to return the array?
   return images; // returns undefined, not waiting for all the data
   // I'm not sure how to wait for the array to be updated.
}});

思想?

所以,回顾一下,我想得到一个从传递给Meteor方法的网站上抓取的所有图像源的数组。

1 个答案:

答案 0 :(得分:2)

tutorialMeteor.wrapAsync提出了一个好的this previous answer。另外{{3}}提供了更多详细信息并解释了错误处理。

所有操作都发生在服务器上。在你的情况下:

Meteor.methods({
  getData(url) => {
    const syncScrape = Meteor.wrapAsync(scrape.request);
    try {
      const $ = syncScrape(url,{});
      let images = [];
      $('img').each(img => {
        images.push(img.attribs.src);
      });
      return images;
    }
    catch(error) {
      throw new Meteor.error(error);
    }
  }
});

此外,您的客户呼叫需要包含来自回调的错误:

Meteor.call("getData", url, (error, images) => {
  if (!error) console.log(images); // get array of image src
});