我正在尝试创建一个新的 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/