2016-08-23 98 views
-1

我知道this stackoverflow答案,我一直在使用它來幫助我。 但是,當我將代碼應用於我的情況時,會發生一些奇怪的事情。 似乎在我的代碼中名爲execSync的wrapAsync函數運行並輸出它應該是的;不過,它剛剛完成了最後的工作,就像我之前使用wrapAsync一樣。流星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'。嘗試不,我猜如果你傳遞錯誤的參數數目,流星不會正確包裝。 – 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); 
    }); 
}); 

你包裝的函數的最後一個參數需要是一個函數,它將一個錯誤和一個結果作爲參數(而不是別的)。

此外,一旦你有異步功能,你不再提供回調。相反,你正在等待回報。