JavaScript Promise和this关键字

时间:2013-10-27 19:47:16

标签: javascript angularjs

鉴于以下JS,如何设置message对象的PlateCheck属性?

var plateCheck = {
        plateNumber: '',
        message: '',
        alertClass: '',
        checkPlate: function (plateNumber) {
            PlateCheckService.checkPlate(plateNumber).then(function (response) {
                var data = response.data;

                if (data.VehicleAtl !== null) {
                    this.message = "Hot!";
                    this.alertClass = 'alert-danger';
                } else {
                    this.message = "Plate #" + data.PlateNumber + " is clean.";
                    this.alertClass = 'alert-success';
                }
            });
        }
    };

修改

PlateCheckService.checkPlate(plateNumber)返回承诺......

1 个答案:

答案 0 :(得分:3)

这可能只是一个范围问题,但是通过调用plateCheck.checkPlate(fooPlateNumber)来返回同一个对象可能会解决这个问题。

var plateCheck = {
        plateNumber: '',
        message: '',
        alertClass: '',
        checkPlate: function (plateNumber) {
            var me = this;
            PlateCheckService.checkPlate(plateNumber).then(function (response) {
                var data = response.data;
                me.plateNumber = plateNumber;
                if (data.VehicleAtl !== null) {
                    me.message = "Hot!";
                    me.alertClass = 'alert-danger';
                } else {
                    me.message = "Plate #" + data.PlateNumber + " is clean.";
                    me.alertClass = 'alert-success';
                }
            });
        }
    };

但也许您可以只提取服务功能,以便返回plateCheck对象。

function checkPlate(plateNumber) {
    var plateCheck = {};
    plateCheck.plateNumber = plateNumber;
    PlateCheckService.checkPlate(plateNumber).then(function (response) {
        var data = response.data;
        if (data.VehicleAtl !== null) {
            plateCheck.message = "Hot!";
            plateCheck.alertClass = 'alert-danger';
        } else {
            plateCheck.message = "Plate #" + data.PlateNumber + " is clean.";
            plateCheck.alertClass = 'alert-success';
        }
    });
    return plateCheck;
}