获得$ q的解决或拒绝结果

时间:2014-05-31 14:27:02

标签: javascript angularjs

我正在查看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"
});

3 个答案:

答案 0 :(得分:0)

您倾向于将您的作业放在承诺回调中:

pizzaDelivered.then(
  function(food) {
    $scope.successResult = man.eat(food);
  }, 
  function(reason) {
    $scope.failureResult = man.beHungry(reason);
  });

然后,在Angular中,您可以在视图中使用这些范围变量,它们将在promise解析后出现:

{{successResult}}
{{failureResult}}

Demo

答案 1 :(得分:0)

由于resolvereject异步发生,因此设置任何结果变量必须在回调中发生:

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