等到成功或错误发生

时间:2016-04-05 02:30:48

标签: angularjs asynchronous promise

我尝试在工厂中使用$http.get()来检索将在控制器中进一步处理的值。

appFac.factory('CompletedJobs',function($http){
var result;
    return{
        getJobs : function(webserviceurl){
            $http.get(webserviceurl).success(function(data){
                result = data;
            })
            .error(function(err){
                result = '';
            });
            return result;
        }
    }
})

appCtrl.controller('Ctrl',function(CompletedJobs){
    var data = CompletedJobs.getJobs('some url');
    // some other logic based on data
});

由于异步,当数据在工厂方法内可用时,它对控制器没用,因为工厂方法已经返回undefined

任何人都可以帮我解决如何从工厂方法获取数据,以便控制器可以使用它吗?

2 个答案:

答案 0 :(得分:1)

在您的工厂中,您应该返回成功或错误的承诺,而不是显式返回结果,因为这将在您的承诺得到解决之前返回。像这样修改你的工厂。

appFac.factory('CompletedJobs',function($http, $q){
    return{
        getJobs : function(webserviceurl){
            var deferred = $q.defer();
            $http.get(webserviceurl).then(function(response){
                deferred.resolve(response.data);
                return deferred.promise;
            });
        }
    }
})

appCtrl.controller('Ctrl',function(CompletedJobs){
    var data = CompletedJobs.getJobs('some url');
    // some other logic based on data
});

这应该适合你。

答案 1 :(得分:0)

在工厂返回承诺。

void InitializeB(CrossReference arr[])
{
    InitializeBBlock(arr, 0x00, 0x00);
    InitializeBBlock(arr, 0x10, 0x00);
    InitializeBBlock(arr, 0x20, 0x04);
    InitializeBBlock(arr, 0x30, 0x04);
    InitializeBBlock(arr, 0x40, 0x00);
    InitializeBBlock(arr, 0x50, 0x00);
    InitializeBBlock(arr, 0x60, 0x04);
    InitializeBBlock(arr, 0x70, 0x04);

    InitializeBBlock(arr, 0x80, 0x08);
    InitializeBBlock(arr, 0x90, 0x08);
    InitializeBBlock(arr, 0xA0, 0x10);
    InitializeBBlock(arr, 0xB0, 0x10);
    InitializeBBlock(arr, 0xC0, 0x08);
    InitializeBBlock(arr, 0xD0, 0x08);
    InitializeBBlock(arr, 0xE0, 0x10);
    InitializeBBlock(arr, 0xF0, 0x10);
}

void InitializeBBlock(CrossReference arr[], int idxStart, int hexStart)
{
    for(int j = idxStart; j < idxStart + 4; j++)
    {
        int baseIdx = idxStart + 4 * (j - idxStart);

        for(int i = 0; i < 4; i++)
        {
            arr[baseIdx + i].A = i + hexStart;
        }
    }
}

来自承诺的控制器

appFac.factory('CompletedJobs',function($http){
return {
    getJobs : function(webserviceurl){
        //return the promise
        return $http.get(webserviceurl);
    }
};