2016-03-07 43 views
0
serviceApp.factory('xml2json', function() { 

return { 
Convert: function(path) { 
    var fs = require('fs'); 
    var xml2js = require('xml2js'); 
    var parser = new xml2js.Parser(); 
    var json; 

    fs.readFile(path, function(err, data) { 
     parser.parseString(data, function(err, result) { 
     json = result.object.property[9].steps[0].object[27].property[1].property[0].object; 
     console.log(json); 
     }); 
    }); 
    console.log(json + '1'); 
    return json; 
    } 
} 
}); 

這是我的服務^^無論出於何種原因,第一個控制檯日誌工作正常,正如預期的那樣。第二個是未定義的。當我返回json時,它返回undefined。我試過定時器,我試過承諾,我試過回調。我不知道如何讓這個返回parser.parseString()的結果。請幫忙。無法獲得正確的返回對象。

serviceApp.controller('PPQACtrl', function($scope, SqlConFactory, CreateRequest, EmailService, xml2json) { 
    var path = '/some/path/to/file.xml' 
    var myjson = xml2json.Convert(path); 
    console.log(myjson); 


}); 
+0

'fs.readFile'和'parser.parseString'是「異步, 「所以他們自動返回。 – usandfriends

+0

謝謝你,我已經閱讀並嘗試了很多文章。我仍然在做錯事。 是的,我知道他們是異步並立即返回。我試過強制setTimeout和回調,並承諾。請閱讀我原來的帖子。我對這個實現並不瞭解,爲什麼這些解決方案都不適合我。 –

回答

0

由於調用是異步的,您可以使用promise或callback來返回數據。下面是重構使用回調代碼的一個例子:

服務:

serviceApp.factory('xml2json', function() { 
    return { 
     Convert: function(path, callback) { 
      var fs = require('fs'); 
      var xml2js = require('xml2js'); 
      var parser = new xml2js.Parser(); 
      var json; 

      fs.readFile(path, function(err, data) { 
       parser.parseString(data, function(err, result) { 
        json = result.object.property[9].steps[0].object[27].property[1].property[0].object; 
        callback(json); 
       }); 
      }); 
     } 
    } 
}); 

和使用:

xml2json.Convert(path, function(json) { 
    console.log(json); 
});