当承诺在监视函数中解析时,如何使承诺的 then 函数起作用
How to make a promise's then function work when the promised is resolved in a watch function?
我正在尝试在用户从选择菜单中进行选择后和之后触发一些代码。因此,我尝试使用承诺和 $scope.$watch 函数。我正在解决该监视函数中的承诺,但承诺的 then 函数没有被触发。$scope.$apply() 似乎在这种情况下不起作用。我怎样才能让这个函数触发?
代码如下:
var nameSpace = angular.module("test", []);
nameSpace.controller("DataRetriever", ['$scope','$http', '$q', function($scope, $http, $q)
{
$scope.options = ["1","2","3"];
$scope.displayText = false;
console.log("options set");
var deferred = $q.defer();
$scope.selectedOption = "";
$scope.$watch("selectedOption", function (newValue, oldValue) {
if (newValue != "") {
deferred.resolve(newValue);
console.log("Resolve called! New value: ", newValue);
} else {
deferred.reject("Invalid option!");
}
});
deferred.promise.then(function(data){
$scope.displayText = true;
console.log("Then success callback function executed!");
});
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="test" ng-controller="DataRetriever as dr">
<select ng-model="selectedOption"><option ng-repeat="option in options">{{option}}</option>
</select>
<div ng-show="displayText">Then success callback function executed!</div>
</div>
承诺只会解决一次,所以第一次会成功并做你想做的事,但之后的任何时候它都不会再次解决它。[参考] 所以你想要完成的事情不可能用承诺来实现。
为什么你的代码不起作用是因为第一个分辨率是reject
,你可以通过在 else 条件中添加 console.log
来验证。一旦被拒绝,承诺就无法改变,因此行为也无法改变。
@PSL是正确的使用标准ng-change
相关文章:
- 从函数返回角度承诺
- 如何按照承诺使用mocha/chai/chai测试ES7异步函数
- 两个函数之间的角度承诺
- 当链接javascript承诺时,如何处理then()函数中的条件
- 角承诺的“then”函数的成功回调的词汇范围是什么?
- JQuery 承诺已经包含回调的函数
- 将同步函数包装到承诺中的最佳方法是什么?
- 在同一函数中解析承诺后返回承诺
- JavaScript中的延期/承诺概念是一个新的概念,还是函数式编程的传统部分
- “未捕获(在承诺中)”在获取“then”方法中调用拒绝函数时
- 使用 Promise 在另一个函数中调用带有 Bluebird 承诺库的函数
- 从承诺返回不返回函数会导致警告
- 尝试编写承诺时出错:承诺解析器对象不是函数
- 如何在恢复函数之前等待 JavaScript 承诺解析
- WinJS,从可能是异步的函数返回一个承诺,也可能不是异步的
- javascript承诺在循环中或如何逐个调用函数
- 按照承诺,通过与chai的函数调用验证已解析承诺的内容
- ES6承诺:如何用参数链接函数
- OfflineAudioContext.startRendering()基于承诺的函数在safari中不起作用
- NodeJS 多函数承诺