AngularJS如何在$ http成功函数中设置变量依赖提供程序

时间:2014-07-15 09:24:18

标签: javascript angularjs http

我是angularjs的新手,我正在尝试创建新的提供商。这是我的代码:

myApp.provider('$Data', function() {
    this.URL = 'http://maps.googleapis.com/maps/api/geocode/json?address=Singapore, SG, Singapore, 153 Bukit Batok Street 1&sensor=true';

    this.$get = $get;
    $get.$inject = ['$http', '$q'];

    function $get($http, $q) {
        var that = this;
        return {
            isConnected: function() {
                var bIsConnected = 'Default';
                $http({method: 'GET', url:that.URL}).then(function (data) {
                           bIsConnected = 'Yes';
                           alert('Run this code!');
                        }, function (data) {
                            bIsConnected = 'No';
                        });
                return bIsConnected;
            }
        }
    }
});

Jsfiddle演示: http://jsfiddle.net/0udm9/9dPsb/6/

运行$ Data.isConnected()之后,虽然浏览器显示警告框,但结果始终为“默认”。我认为它来自成功功能不是$ get。在这种情况下,我必须使用提供商,而不是服务或工厂。我能解决这个问题吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

您必须在代码中使用promise。 DEMO

提供者:

isConnected: function() {
    var deferred = $q.defer();

    $http.get(that.url).then(function(res) {
        deferred.resolve('Yes');
        console.log('example:success', res);
    }, function(err) {
        deferred.resolve('No');
        console.log('example:error', err);
    });

    return deferred.promise;
}

控制器:

$Data.isConnected().then(function(data) {
    $scope.data = data;
});

// UPD

如果需要使用带有异步代码的返回值,则必须使用对象。 DEMO

// UPD 2

FRESH DEMO LINK