使用Angular的屈服(ES6)

时间:2015-02-17 16:55:01

标签: javascript angularjs ecmascript-6 es6-promise

我正在玩ES6并尝试让yield使用角度请求。 var data = yield getData();没有像我期待的那样工作。我收到了{"value":{"$$state":{"status":0}},"done":false},我希望得到{"value":"its working!","done":true}

这是我的代码。

的index.html

<!DOCTYPE html>
<html ng-app="app">
  <body ng-controller="bodyCtrl">
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.0/angular.js"></script>
    <script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
    <script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
    <script>
        angular.module('app', []);
angular.module('app')
  .controller('bodyCtrl', function ($scope, $http, $q) {
  var getData = function () {
    var deferred = $q.defer();

    $http.get('data.json').then(function (response) {
      console.log(response.data.myData);
      deferred.resolve(response.data.myData);
    });

    return deferred.promise;
  };


  var myGen = function*(){
    var data = yield getData();
    var two = yield 2;
    var three = yield 3;
    console.log(data, two, three);
  };


  var gen = myGen();
  console.log(JSON.stringify(gen.next()));
  console.log(JSON.stringify(gen.next()));
  console.log(JSON.stringify(gen.next()));
  console.log(JSON.stringify(gen.next()));
});
    </script>

  </body>
</html>

data.json

{"myData": "its working!"}

结果

{"value":{"$$state":{"status":0}},"done":false}
{"value":2,"done":false}
{"value":3,"done":false}

{"done":true}

非常感谢一点解释!

1 个答案:

答案 0 :(得分:0)

你做错了。实际上ES6生成器只是不是一次返回(产生)一些值,而是每个需求一个。他们不会等到你的承诺得到解决。如果要使用生成器以同步方式执行异步操作,则必须将代码包装到某个co函数中:

co(function*() {
    var gen = myGen();
    console.log(yield gen.next());
    console.log(yield gen.next());
    console.log(yield gen.next());
    console.log(yield gen.next());
})();

co实现的地方你可以找到:

等等(在某些实现中,您不需要立即执行它)

另外see answers of this question了解更多信息。