ES6承诺和阶级冲突

Jus*_*ine 5 javascript jquery ecmascript-6

我很困惑为什么有时当我使用一个类的实例和一个承诺的组合我得到两种错误.如果我使用带有两个或三个链式承诺的Promise.all(),我有时只会在回调中得到一个未定义变量的错误.当我有一个包含多个属性和方法的复杂类时,我有一个未定义的类的实例与我的.then() 如果我的类很简单,我只使用一个或两个链式的promises我没有错误.有没有人知道为什么会这样?以下是我的目标代码结构示例:

(代码在最新的Firefox Nightly中正确执行,但在Chrome 47中没有执行)

'use strict';

class Controller {
	constructor() {
		this.data = 'data';
		this.moredata = 'data';
		this.evenmore = ['a', 'b', 'c'];
		this.dataobj = {"a" : "1", "b" : "2", "c" : "3"};
	}
}

//BLOCKED CODE
{
	let cc = new Controller();
	let loadeddata = null;
	
	let xhr = $.getJSON('chapters.json', {}, (response) => {
		loadeddata = response; //SOMETIMES IF CLASS IS COMPLEX IS NOT DEFINED (SOMETIMES IT IS)
	}).fail(() => {
		console.log('Failed to load JSON data!');
	});
	
	let xhr2 = $.getJSON('chapters.json', {}, (response) => {
		loadeddata = response;
	}).fail(() => {
		console.log('Failed to load JSON data!');
	});
	
	let xhr3 = $.getJSON('chapters.json', {}, (response) => {
		loadeddata = response;
	}).fail(() => {
		console.log('Failed to load JSON data!');
	});
	
	let xhr4 = $.getJSON('chapters.json', {}, (response) => {
		loadeddata = response;
	}).fail(() => {
		console.log('Failed to load JSON data!');
	});
	
	
	//SOMETIMES WITH COMPLICATED CLASS WITH ONE OR TWO PROMISES DOES NOT THROW ERROR
	Promise.all([xhr, xhr2, xhr3, xhr4]).then(() => {
		console.log(loadeddata); 
		console.log(cc); //SOMETIMES CC IS NOT DEFINED (SOMETIMES IT IS)
	});
}
Run Code Online (Sandbox Code Playgroud)

Bek*_*Bek 0

jquery$.ajax不返回标准承诺,因此您不应该Promise.all与它们一起使用(尽管可以),您可以使用$.when与 jquery 等效的替代。并且您可以一次性收听所有延迟/承诺,而不是收听每个延迟/承诺的失败或成功$.when

var xhr1 = $.getJSON('chapters.json');
var xhr2 = $.getJSON('chapters.json');
var xhr3 = $.getJSON('chapters.json');

$.when(xhr1, xhr2, xhr1)
 .done(function(response1, response2, response3){

 })
 .fail(function(data, textStatus, jqXHR){ // first failed xhr 

 });
Run Code Online (Sandbox Code Playgroud)

(该代码在最新的 Firefox Nightly 中可以正确执行,但在 Chrome 47 中则不能)

它不能在 chrome 47 中工作而不能在 Firefox Nightly 中工作的原因是 ES6 classes 在 chrome 中尚未完全支持(它目前chrome://flags/#enable-javascript-harmony在 chrome 47 中处于功能标志下)