javascript - ES6 生成器——它们真的是异步/等待的替代品吗?

标签 javascript typescript async-await generator ecmascript-6

this评论区的帖子之一 typescript 博客文章说:

If I have to wait until 2.0 for ES6 generator support, I'm just gonna stick with Traceur. Generators are a big deal, they give you async/await support today using libraries such as Koa, Co, Bluebird, etc.

Async/await 关键字将允许应用程序保留类似于同步代码的逻辑结构。如何使用生成器来完成类似的事情?例如,您将如何结合使用生成器和 ajax 调用来生成避免使用回调的同步样式代码?

最佳答案

您只需使用辅助函数对其进行抽象即可。

假设 jQuery:

function ajax(type, url, data){
  $.ajax({
    url: url,
    data: data,
    type: type
  })
  .done(function(data) {
    iterator.next(data);
  })
  .fail(function() {
    iterator.throw();
  });
}
var get = ajax.bind(null, 'GET');
var post = ajax.bind(null, 'POST');
var put = ajax.bind(null, 'PUT');
var patch = ajax.bind(null, 'PATCH');
var del = ajax.bind(null, 'DELETE');

function *asyncGet() {
  var URL = 'https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow'
  var data = yield get(URL);
  console.log(data);
}

var iterator = asyncGet();
iterator.next();

另一个使用 setTimeout 的例子:

function delayReturn(time, val){
  setTimeout(function(){
    iterator.next(val);
  }, time);
}
var delayReturn1s = delayReturn.bind(null, 1000);

function *main() {
  console.log(yield delayReturn1s('Lolcat'));
}

var iterator = main();
iterator.next()

当然你可以抽象迭代器传递这样的东西:

var async = function(generator){
  var resume = function(err, data){
    if (err) iterator.throw();
    iterator.next(data);
  }
  var iterator = generator(resume);
  iterator.next();
}

然后你可以简单地:

function ajax(type, url, data, cb){
  $.ajax({
    url: url,
    data: data,
    type: type
  })
  .done(function(data) {
    cb(null, data)
  })
  .fail(function() {
    cb(arguments);
  });
}
var get = ajax.bind(null, 'GET');
var post = ajax.bind(null, 'POST');
var put = ajax.bind(null, 'PUT');
var patch = ajax.bind(null, 'PATCH');
var del = ajax.bind(null, 'DELETE');

async(function *(resume) {
  var URL = 'https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow'
  var data = yield get(URL, null, resume);
  console.log(data);
});

关于javascript - ES6 生成器——它们真的是异步/等待的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236960/

相关文章:

javascript - 从串行端口 -> Chrome 应用程序 -> 网页进行通信。网页启动。

angular - 从事件回调更新数组

组件之间的 Angular 4 通信不起作用

javascript - TypeScript 编译器包含来自 TypeScript 定义的具有不同名称的模块

c# - SemaphoreSlim 取消 token

HTML 导入中的 Javascript 不影响导入的 HTML

javascript - 忽略叠加 div

javascript - 使 Axios post 来自 Gatsby JS 的请求

c# - 使用 MVVM 在中继命令中运行异步方法

asp.net - 我应该将工作卸载到 ASP.NET 中的其他线程吗?