Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在英语中正确使用承诺_Javascript_Angularjs_Promise - Fatal编程技术网

Javascript 在英语中正确使用承诺

Javascript 在英语中正确使用承诺,javascript,angularjs,promise,Javascript,Angularjs,Promise,我正试图让我的头脑围绕着AngularJS中的承诺概念 以下代码是否在正确的轨道上?有人能解释一下PlateCheckService.checkPlate的方法吗?如果我不退还承诺,为什么return$http.post()。那么为什么带有消息和alertClass的对象的内部返回不起作用?我认为这是一个被束缚的/内在的承诺 /// <reference path="angular.js" /> (function () { "use strict" var app = angul

我正试图让我的头脑围绕着AngularJS中的承诺概念

以下代码是否在正确的轨道上?有人能解释一下PlateCheckService.checkPlate的方法吗?如果我不退还承诺,为什么
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'
       });