我正在查看Mastering Web Application Development with Angular中的$q
示例。
对于此代码,如何检索pizzaOrderFulfillment.resolve(...)
或pizzaOrderFulfillment.reject
的字符串结果?
var myApp = angular.module('myApp',[]);
myApp.controller("MyCtrl", function ($scope, $q) {
var Person = function(name) {
this.eat = function(food) {
return name + " is eating " + food;
};
this.beHungry = function(reason) {
return name + " is hungry because" + reason;
};
};
// success
var pizzaOrderFulfillment = $q.defer();
var pizzaDelivered = pizzaOrderFulfillment.promise;
var man = new Person("man");
pizzaDelivered.then(man.eat, man.beHungry);
pizzaOrderFulfillment.resolve("chicken");
// TODO: var successResult = "man is eating chicken"
});
答案 0 :(得分:0)
您倾向于将您的作业放在承诺回调中:
pizzaDelivered.then(
function(food) {
$scope.successResult = man.eat(food);
},
function(reason) {
$scope.failureResult = man.beHungry(reason);
});
然后,在Angular中,您可以在视图中使用这些范围变量,它们将在promise解析后出现:
{{successResult}}
{{failureResult}}
答案 1 :(得分:0)
由于resolve
和reject
异步发生,因此设置任何结果变量必须在回调中发生:
var myApp = angular.module('myApp',[]);
myApp.controller("MyCtrl", function ($scope, $q, $log) {
var Person = function(name) {
this.eat = function(food) {
return name + " is eating " + food;
};
this.beHungry = function(reason) {
return name + " is hungry because" + reason;
};
};
// success
var pizzaOrderFulfillment = $q.defer();
var pizzaDelivered = pizzaOrderFulfillment.promise;
var man = new Person("man");
var successResult = null;
pizzaDelivered.then(function(food) {
successResult = man.eat(food);
}, function(reason) {
successResult = man.beHungry(reason);
}).finally(function() {
$log.info("successResult: %s", successResult);
$scope.output = successResult;
});
pizzaOrderFulfillment.resolve("chicken");
});
以下是其中的一个示例:http://plnkr.co/edit/VLa2qcD4XUDcO3Wo8mUl?p=preview
我做了另一个示例,通过使用$timeout
来演示$q
的异步性质。它还有两个承诺,一个被解决,另一个被拒绝:http://plnkr.co/edit/Rq715C7NmhvXnao2i9xy?p=preview
答案 2 :(得分:0)
由于我们在这里讨论promises,你添加了回调(使用then),当你“拒绝\解析”deferred对象时会触发回调。
在您的情况下,您需要在promise中分配var。
var myApp = angular.module('myApp',[]);
myApp.controller("MyCtrl", function ($scope, $q) {
var Person = function(name) {
this.eat = function(food) {
return name + " is eating " + food;
};
this.beHungry = function(reason) {
return name + " is hungry because" + reason;
};
};
// success
var pizzaOrderFulfillment = $q.defer();
var pizzaDelivered = pizzaOrderFulfillment.promise;
var man = new Person("man");
// This was commented out just so you can see this example.
//pizzaDelivered.then(man.eat, man.beHungry);
var successResult = null;
pizzaDelivered.then(function(food){
successResult = man.eat(food); // var successResult = "man is eating chicken"
console.log(successResult);
});
// You can add more callbacks to "pizzaDelivered" using commas as you did in your main example.
pizzaOrderFulfillment.resolve("chicken"); // after resolving the defered object the callbacks are suppose to run.
});
这是Fiddle。