Meteor WrapAsync异步工作

时间:2016-08-23 21:39:55

标签: javascript asynchronous meteor

我知道this stackoverflow的答案,我一直用它来帮助我。 然而,当我将代码应用于我的情况时会发生一些奇怪的事情。 看起来我的代码中名为execSync的wrapAsync函数运行并输出它应该的内容;然而,它刚刚完成,就像我之前使用wrapAsync一样。

代码

SELECT GROUP_CONCAT(t_author.aut_name) as authors, t_genre.genre_name as genre FROM t_author 
LEFT JOIN t_genre ON t_author.aut_genre = t_genre.genre_id
 GROUP BY t_author.aut_genre

**输出**

Meteor.methods({
  'distinctSpecs'({}){
    console.log("called");
    var json_categories_clean   =   [];
    var execSync                =      
      Meteor.wrapAsync(require("child_process").exec, 
                       require("child_process"))
    var returned_data           =   
      execSync(
        "mongo products --eval \"var collection='laptops', outputFormat='json'\" variety.js", 
        { cwd:"/home/jonathan/Documents/variety-master"}, 
        (err, stdout, stderr) => {
          if (err) {
            console.error(err);
            console.log(stdout);
            console.log(stderr);
            return;
          }
          console.log("waited for this");
          var     json_categories         =   
            JSON.parse(stdout.substring(
              stdout.indexOf('[', stdout.indexOf('[')+1),
              stdout.lastIndexOf(']')+1));     

          for (var x=0; x < json_categories.length; x++) {
            json_categories_clean.push(json_categories[x]["_id"])
          }
          console.log("returning inner");
          return json_categories_clean;
        });
    console.log("returning outer");
    return returned_data;
  }
});

1 个答案:

答案 0 :(得分:1)

格式化代码后,很明显您正在调用wrapAsync错误:

Meteor.wrapAsync(require("child_process").exec, 
                       require("child_process"))
你可能想要:

const exec = Npm.require("child_process").exec;
Meteor.wrapAsync(a, b, function(callback) {
  exec(a, b, function(err, stdout, stderr) {
    callback(err, stdout);
  });
});

您包装的函数的最后一个参数需要是一个函数,它将错误和结果作为参数(而不是其他)。

此外,一旦您拥有异步功能,您就不再提供回叫。你正在等待返回。