Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

没有 Promise 也要手动实现队列

  Promise 虽然是好东西,而且一些浏览器也提供了原生支持,但毕竟目前主流的大多数浏览器还尚不支持。一个微型的前端项目兴师动众地引入一个庞大的 polyfill 感觉也非常浪费。那么在没有 Promise 的场景下怎么办?这是个奢侈的纠结,在没用 Promise 之前很少会有的。
  在没有 Promise 的场景下,我们通常使用回调来解决问题,这是一贯以来的作法。但有时候 Promise 解决的不仅仅是回调的问题,还解决队列问题。比如下面这个例子
var xxx = func();
xxx.then(function() {
  // handler 1
});
xxx.then(function() {
  // handler 2
});
  一个异步请求的结果在多处被使用怎么办?回调函数只有一个,难道又是用「垂直嵌套调用」来解决问题?这确实也是一种解决方案,但我总是觉得很恶心。通常我会手动实现一个队列来解决,这并不困难。
var queue = [];
var resolve = function() {
  while(queue.length) queue.shift().apply(null, arguments);
};
var func = function(callback) {
  // 如果队列非空(表示有任务正在执行)则进入等待
  if(queue.push(callback) > 1) return;
  // 在一个异步中执行回调
  setTimeout(function() {
    queue.resolve(xxx);
  });
};
func(function() {
  // handler 1
});
func(function() {
  // handler 2
});
  上面这个破代码就实现了这样一个队列。之所以称为破代码是因为把 queue、resolve 以及 func 都定义为同一级的变量了。而这些额外的东西是可以封装掉的,比如使用闭包或直接作为静态属性定义到函数上。
  好像这篇文章没啥重点,只是告诉大家要重视异步函数的队列并给个根本没什么卵用的 demo 而已。  
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^