如何检查promise中返回的数据是否为空

时间:2016-08-17 21:52:57

标签: javascript angularjs

我有以下非常简化的代码段:

c.then(function(data){
    vm.checkedOut = data;
});

它将返回记录,或者不会。无论哪种方式,promise都会返回一个对象 - 它可能没有附加任何记录数据。

到目前为止,这么好。这是我的问题:如何在我的视图中检测无记录响应?

我这样做:

<div ng-if="vm.checkedOut.loaneeName !== undefined">
    checked out!
</div>

loaneeName是记录的属性,如果没有返回记录,它将是未定义的。有点草率,但它的工作原理。

然而,这就是我如何显示相反的信息:

<div ng-if="vm.checkedOut.loaneeName === undefined">
    not checked out!
</div>

因为vm.checkedOut.loaneeName 始终总是在页面首次加载时(并等待来自API的响应),所以“未签出!”消息出现,至少有一段时间,如果连接速度足够慢,这可能非常糟糕。

要解决此问题,我已完成以下操作:

    c.then(function(data){
        vm.checkedOut = data;
        if(vm.checkedOut.loaneeName === undefined){
            vm.forRealsCheckedOut = true;
        }
        else {
            vm.forRealsCheckedOut = false;
        }
    });

然后:

<div ng-if="vm.forRealsCheckedOut === false">
    not checked out!
</div>
...

这有效,但它也让我觉得这是一个稍微粗略的解决方法,因为我认为应该是一个常见的问题。

not是第一个提出这样问题的人,但我没有数组and other answers aren't much help

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

你的问题的基础是,如果连接很慢,那么“没有签出!”消息将出现,直到加载数据。您需要检测数据实际加载的时间。您可以通过检查是否已定义vm.checkedOut来执行此操作:

<div ng-if="vm.checkedOut !== undefined && vm.checkedOut.loaneeName === undefined">
    not checked out!
</div>

只有定义了vm.checkedOut且定义了vm.checkedOut.loaneeName,才能看到“未签出”消息。

或者您可以在.then()函数中添加一个标志变量,该变量将指示数据已加载的ng-if语句,并且可以开始检查加载的值:

$scope.dataLoaded = false;

c.then(function(data){
    vm.checkedOut = data;
    $scope.dataLoaded = true;
});

<div ng-if="dataLoaded && vm.checkedOut.loaneeName === undefined">
    not checked out!
</div>