Использование yield с Angular (ES6)

Я играю с 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>

данные.json

{"myData": "its working!"}

Результат

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

{"done":true}

Был бы очень признателен за небольшое объяснение!


person Daniel Rasmuson    schedule 17.02.2015    source источник


Ответы (1)


Вы делаете это неправильно. На самом деле генераторы 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 реализацию вы можете найти в:

и так далее (в некоторых реализациях сразу выполнять не нужно)

Также см. ответы на этот вопрос, чтобы понять больше.

person alexpods    schedule 17.02.2015