2

我正在玩 ES6 并尝试yield处理角度请求。var data = yield getData();没有按照我预期的方式工作。我得到了{"value":{"$$state":{"status":0}},"done":false},我想得到{"value":"its working!","done":true}

这是我的代码。

索引.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>

数据.json

{"myData": "its working!"}

结果

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

{"done":true}

也非常感谢一些解释!

4

1 回答 1

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您可以在哪里实现:

依此类推(在某些实现中,您不需要立即执行它)

请参阅此问题的答案以了解更多信息。

于 2015-02-17T17:54:34.777 回答