【问题标题】:ES6 Generator with $http service带有 $http 服务的 ES6 生成器
【发布时间】:2016-06-24 12:47:37
【问题描述】:

我正在尝试将客户端的 ES6 生成器与 Angular $http 服务一起使用。如果可能的话,我希望能够在不使用回调的情况下使用 $http 服务。喜欢:

var gen = function* () {
    var test = yield $http.get('/test/');
    console.log(test);
};

var http = gen();
http.next();
http.next(); // returns undefined

/// or ///

var gen = function* () {
    yield $http.get('/test/');
};
console.log(http.next()); //returns a promise object which won't allow me to use the needed data

之所以这么问是因为我想模仿这个演示https://youtu.be/QO07THdLWQo?t=4m58s

我只是在寻找最简单、最直接的方法。有什么建议吗?

【问题讨论】:

  • 生成器并不神奇地知道承诺。您需要一些跑步者来异步推进它们。您使用的是哪个库?
  • 它返回一个承诺。生成器不处理异步性质
  • 我只是想遵循与上面链接类似的逻辑(我更新了帖子)
  • @muninn9:如果你足够密切地关注视频,他提到你必须使用smartCodecoPromise.coroutineQ.spawn 之类的东西。你不做那些事。他在代码中留下的 console.log(gen.next(…)) 之类的东西不再适用于产生承诺 - 他应该删除它,这令人困惑。

标签: javascript angularjs


【解决方案1】:

一种可能的选择是将生成器函数包装在 Bluebird 的 Promise.coroutine 中,如下所示:

//make sure Bluebird source code is included

Promise.coroutine(function* () {
    var gen = yield $http.get('/test/');
    console.log(gen.data);
})();

这已被证明在更复杂的应用程序中非常有用,我希望其他人也会发现它也很有用。出于这个原因,尽管投反对票,我仍然保留这个问题。这是有关该主题的有用链接: https://gist.github.com/learncodeacademy/bf04432597334190bef4

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 2016-09-10
    • 2019-09-25
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2021-03-24
    • 2018-04-14
    • 2011-01-18
    相关资源
    最近更新 更多