Angularjs 为什么我没有从http服务中定义?
我创建$http服务并使用$q 这是我的$http服务:Angularjs 为什么我没有从http服务中定义?,angularjs,Angularjs,我创建$http服务并使用$q 这是我的$http服务: function dashboardService($http, $log, $q, config) { var service = { getClientId: getClientIDByLayout, }; return service; function getClientIDByLayout(layoutId) { var deferred = $q.defer
function dashboardService($http, $log, $q, config) {
var service = {
getClientId: getClientIDByLayout,
};
return service;
function getClientIDByLayout(layoutId) {
var deferred = $q.defer();
return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
deferred.resolve(result.data);
}, function (result) {
deferred.reject(result);
});
return deferred.promise;
}
}
下面是我如何调用控制器内部的服务:
dashboardService.getClientId(layoutId).then(function (data) {
var t = data;//undifined
});
但我在这一行中得到的结果是var t=data
是undefined
你知道为什么我没有从服务中定义吗?基本上,你的
getClientIDByLayout
函数中有两个return语句,它们都返回promise
本身。正如我看到的,您当前的实现正在创建新的承诺
&手动管理拒绝/解决。但问题是第一个返回语句(return$http.get(
)使其他返回语句(return-deferred.promise
)变得多余。因此,第一个承诺从控制器返回到订阅。最终,$http.get
不会返回任何内容,因此在随后的成功回调中,您会得到未定义的
您可以通过删除第一条return语句轻松解决此问题,如下所示
function getClientIDByLayout(layoutId) {
var deferred = $q.defer();
//removed `return` from below code.
$http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
deferred.resolve(result.data);
}, function (result) {
deferred.reject(result);
});
//custom promise should get return
return deferred.promise;
}
理想情况下,创建被视为反模式的承诺开销,您可以利用
$http.get
返回的承诺。只需从其成功回调返回一个数据即可链接该承诺
代码
function getClientIDByLayout(layoutId) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId)
.then(function (result) {
//returning data from promise, it will provide it to subsequent `.then`
return result.data;
}, function (error) {
͟r͟e͟t͟u͟r͟n͟ $q.reject(error);
}
);
}
不要使用
$q.defer
,而只需使用中的处理程序函数。然后方法:
function dashboardService($http, $log, ̶$̶q̶,̶ config) {
var service = {
getClientId: getClientIDByLayout,
};
return service;
function getClientIDByLayout(layoutId) {
̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶
return $http.get(config.baseUrl + "api/ClientLayoutMercator?layoutId=" + layoutId).then(function (result) {
̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶s̶o̶l̶v̶e̶(̶r̶e̶s̶u̶l̶t̶.̶d̶a̶t̶a̶)̶;̶
return result.data;
}, function (result) {
̶d̶e̶f̶e̶r̶r̶e̶d̶.̶r̶e̶j̶e̶c̶t̶(̶r̶e̶s̶u̶l̶t̶)̶;̶
throw result;
});
̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶
}
}
。然后
方法返回一个新承诺,该承诺通过成功回调
或错误回调
的返回值来解析或拒绝(除非该值是一个承诺,在这种情况下,它是使用在该承诺中解析的值来解析的)
通过错误地返回带有的承诺,然后
方法包含缺少的函数或语句,服务将返回解析为未定义的承诺
有关详细信息,请参阅