2016-08-23 10 views
-1

私はthisのstackoverflowの答えを知っていて、私はそれを助けるために使用されています。 私の状況にコードを適用すると奇妙なことが起こります。 私のコードでexecSyncと呼ばれるwrapAsync関数が実行され、想定されているものを出力しているようです。しかし、それは私がwrapAsyncを所定の場所に置く前に最後に終わったばかりです。Meteor WrapAsync非同期に動作します

コード

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; 
    } 
}); 

**出力**

called 
returning outer 
waited for this 
returning inner 
+0

私は、あなたが 'execSync'にコールバックを渡すとは思わないと思います。あなたが間違った数の引数を渡すと、Meteorが正しくラップしていないと思います。 – Bergi

答えて

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); 
    }); 
}); 

ラップする関数の最後のパラメータは、エラーと結果をパラメータ(とほかのもの)とする関数である必要があります。

また、非同期機能が設定されていれば、もうコールバックを提供しません。あなたは代わりにリターンを待っています。

関連する問題