javascript - 在表达式中找到 promise 。 Angular 表达式中 promise 的自动展开已被弃用

标签 javascript angularjs expression promise jquery-chosen

我正在尝试创建一个新的 AngularJS 项目,但出现了一些错误:(

这是我的应用程序和 Controller ;

var app = angular.module('myApp', ['localytics.directives'])
    .config(['$parseProvider', function ($parseProvider) {
        return $parseProvider.unwrapPromises(true);
    }])
    .controller('myController', function ($scope, $http, $q, $timeout) {
    var simulateAjax;
    simulateAjax = function (result) {
        var deferred, fn;
        deferred = $q.defer();
        fn = function () {
            return deferred.resolve(result);
        };
        $timeout(fn, 1000);
        return deferred.promise;
    };

    $scope.ListOfTags = function () {
        $http({
            method: 'Post',
            url: 'FillCategories'
        }).success(function (data, status, headers, config) {
            $scope.optionsFromQuery = (function () {
                return simulateAjax(data);
            })();
        }).error(function (data, status, headers, config) {
            $scope.message = 'Unexpected Error';
        });
    }
    $scope.directiveOptions = {
        no_results_text: "Error"
    };
});
<div data-ng-click="ListOfTags()"></div>

我按如下方式使用 Chosen.js:

<select id="select_{{ item.RowId }}" ng-model="chosenModel" chosen="directiveOptions" ng-options="item._categoryId as item._categoryName for item in optionsFromQuery" style="width:200px;">
    <option value="">Select</option>
</select>

当我尝试获取类别时,它正在工作,但抛出了以下异常(这会破坏 Angular 应用程序):

[$parse] Promise found in the expression optionsFromQuery. Automatic unwrapping of promises in Angular expressions is deprecated.

第二次尝试获取类别时,似乎没有任何效果。

这是什么原因造成的?

最佳答案

来自您的代码:

simulateAjax 是一个返回 promise 的函数。接下来,您在 success 回调中调用此方法。

因此 ListOfTags 也会返回 promise。

我会将其实现为 chain promise ,而不是将 success 回调与 then() 混合使用

  • 您可以将它们链接起来以创建代码流
  • 错误传播,所以你可以在链的末端捕获它
  • 实际上,它们很像 众所周知的 try-catch-finally 子句的异步等效项。

示例

$scope.ListOfTags = function() {
        var myHttp = $http({method: 'Post', url: 'FillCategories'});

              myHttp.then(function (result) {
                     return simulateAjax(data); 
                    }).then(function (result) {
                       return result;                            
                    }, function (result) {
                        alert("Error: No data returned");                           
                    });         
    }

如果您有兴趣更改代码,请尝试以下方式(但我仍然更喜欢大写):

 $scope.ListOfTags = function() {
        $http({
            method: 'Post',
            url: 'FillCategories'
        }).success(function (data, status, headers, config) {
            $scope.optionsFromQuery = (function () {
                return simulateAjax(data).then(function (result) {
                       return result;                            
                    }, function (result) {
                        alert("Error: No data returned");
                        return null;
                    });
            })();
        }).error(function (data, status, headers, config) {
            $scope.message = 'Unexpected Error';
        });
    }

关于javascript - 在表达式中找到 promise 。 Angular 表达式中 promise 的自动展开已被弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21680902/

相关文章:

javascript - Vuejs 嵌套组件、模板和使用 Modals

javascript - 响应式设计,移动优先和禁用 JavaScript

javascript - 如何安装Chart.js和angular-chart.js(报错: Chart. 需要包含js库)

css - 没有dom元素的 Angular 模板条件逻辑

python - 我可以更新文本文件的一部分吗?我已经建立了一个登录系统,我想计算一个用户登录了多少次

javascript - 尽量减少js中的重复代码

Javascript 书签导致页面空白

javascript - Angular 变量初始化

C 中的 Char 指针奇怪的表达

php - 使用 mod_rewrite 将路径转换为查询字符串变量