ECMAScript 6

笔记

Posted by zhangyingji on September 28, 2018

前言

记录一些es6的实用用法,es6学习推荐阮一峰《ECMAScript 6 入门》

14 Promise

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例

Promise 新建后立即执行,然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行

// jquery自带promise
Promise.all([
    // 多个ajax请求
	$.ajax({}),$.ajax({})
]).then(result => {
    // 正确
}, err => {
    // 错误
});

Promise.race() 竞速

// 只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数
const p = Promise.race([p1, p2, p3]);

Promise.resolve() 将现有对象转为 Promise 对象

const jsPromise = Promise.resolve($.ajax('/whatever.json'));

应用

加载图片

const preloadImage = function (path) {
  return new Promise(function (resolve, reject) {
    const image = new Image();
    image.onload  = resolve;
    image.onerror = reject;
    image.src = path;
  });
};

缺点

首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

如果某些事件不断地反复发生,一般来说,使用 Stream 模式是比部署Promise更好的选择