Javascript 在英语中正确使用承诺
我正试图让我的头脑围绕着AngularJS中的承诺概念 以下代码是否在正确的轨道上?有人能解释一下PlateCheckService.checkPlate的方法吗?如果我不退还承诺,为什么Javascript 在英语中正确使用承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我正试图让我的头脑围绕着AngularJS中的承诺概念 以下代码是否在正确的轨道上?有人能解释一下PlateCheckService.checkPlate的方法吗?如果我不退还承诺,为什么return$http.post()。那么为什么带有消息和alertClass的对象的内部返回不起作用?我认为这是一个被束缚的/内在的承诺 /// <reference path="angular.js" /> (function () { "use strict" var app = angul
return$http.post()。那么
为什么带有消息和alertClass
的对象的内部返回不起作用?我认为这是一个被束缚的/内在的承诺
/// <reference path="angular.js" />
(function () {
"use strict"
var app = angular.module('cs');
app.service('PlateCheckService', ['$http', function ($http) {
return {
checkPlate: function (plateNumber) {
return $http.post('PlateCheck/Index', {
plateNumber: plateNumber
}).then(function (response) {
return {
message: response.data.VehicleAtl === null ? 'Clean' : 'Hot',
alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger'
}
});
}
}
}]);
app.controller('PlateCheckCtrl', ['$scope', 'PlateCheckService', function ($scope, PlateCheckService) {
var plateCheck = {
plateNumber: '',
message: '',
alertClass: '',
checkPlate: function (plateNumber) {
var _this = this;
PlateCheckService.checkPlate(plateNumber).then(function (response) {
_this.message = response.message;
_this.alertClass = response.alertClass;
});
}
};
$scope.plateCheck = plateCheck;
}]);
}());
//
(功能(){
“严格使用”
var app=角度模块('cs');
app.service('PlateCheckService',['$http',函数($http){
返回{
检查标牌:功能(标牌编号){
返回$http.post('PlateCheck/Index'{
车牌号:车牌号
}).然后(功能(响应){
返回{
消息:response.data.VehicleAtl==null?'Clean':'Hot',
alertClass:response.data.VehicleAtl==null?“警报成功”:“警报危险”
}
});
}
}
}]);
应用程序控制器('PlateCheckCtrl',['$scope','PlateCheckService',函数($scope,PlateCheckService){
var plateCheck={
车牌号:'',
消息:“”,
警报类:“”,
检查标牌:功能(标牌编号){
var_this=这个;
平板检查服务。检查平板(平板编号)。然后(功能(响应){
_this.message=response.message;
_this.alertClass=response.alertClass;
});
}
};
$scope.plateCheck=plateCheck;
}]);
}());
是的,这是因为连锁承诺。请记住,对的调用将在调用它所包含的函数之前返回一个承诺
因此,您在这里的呼叫:PlateCheckService。checkPlate(plateNumber)
将期望返回链接承诺。但是,您的服务的then
附带功能并没有返回承诺。因此,一旦解决该问题,它将无法使用然后
功能进行链接
您可以使用以下psuedo代码将其可视化:
$http.get('url')
.then(function(response) {
return aPromise;
})
.then(function(aPromiseResponse) {
return bPromise;
})
.then(function(bPromiseResponse) {
return cPromise;
})
.then(function(cPromiseResponse) {
// when scope is available
$scope.bindToMe = cPromiseResponse.value;
});
如果要向服务中的承诺链添加功能,那么包装的承诺函数也需要返回承诺
我发现最简单的方法是使用$q.when
<代码>$q。如果对象不是承诺,则when
将在承诺中包装该对象。如果对象已可用(如您的情况),则$q.when
将立即解析。当
处于禁用状态时,$q.的文档
因此,您应该能够通过在服务中使用以下命令使代码正常工作:
return $q.when({
message: response.data.VehicleAtl === null ? 'Clean' : 'Hot',
alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger'
});