angularjs奇怪的数组行为,可能与异步执行有关?

时间:2014-02-12 10:31:56

标签: javascript angularjs

难以重现,所以我会尝试解释。

在angularjs的工厂内,我有一个像这样的功能

angular.module('my').factory('Database', ['$window', 'Raw', function($window, Raw) {
    return {
        read: function() {

其中Raw是下面定义的另一个工厂,它返回一个数据字符串

然后我这样做:

var lines = [];
lines = Raw.data.split("*");

给了我一个字符串数组。

奇怪的行为是它在行[0]未定义时给出错误。 我可以通过添加警报来解决此错误

var lines = [];
lines = Raw.data.split("*");
alert(lines[0])

显示了预期的字符串。但是如果我改为使用console.log命令它就不起作用。

那么,发生了什么?

干杯,

1 个答案:

答案 0 :(得分:1)

听起来像是通过异步方式获得Raw.data,当您尝试拆分它时,它仍然是undefined

如果Raw.data返回承诺,请使用then()回调,例如:

var myModule = angular.module('myModule', []);

myModule.controller('myController', ['$scope', 'Database', function($scope, Database) {
   $scope.text =  Database.read();    
}]);

myModule.factory('Database', ['$window', 'Raw', '$q', function($window, Raw, $q) {

  return {
 read: function() {
         var deferred=$q.defer();
        Raw.data().then(function(data) {
            lines = data.split("*");
          deferred.resolve(lines); 
        });
        return deferred.promise;
     }
   }    
}]);

myModule.factory('Raw', ['$window', '$q', function($window, $q) {
    return {
        data: function() {
            var data = "blah * blah";
            var deferred = $q.defer();              
                deferred.resolve(data);               
                return deferred.promise;
        }
    }
}]);

演示 Fiddle