直接上代码
var getJSON = function(url) {
var promise = new Promise(function(resolve, reject){
var client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);
} else {
reject(new Error(this.statusText));
}
};
});
return promise;
};
getJSON("/posts.json").then(function(json) {
console.log('Contents: ' + json);
}, function(error) {
console.error('出错了', error);
});
promise还有个all方法,传入一个promise数组,直接上代码,这是一段nodejs代码,用于处理异步数据,前台也一样用,都是一个道理。
function getPageAsync(url){ | |
return new Promise(function(resolve,reject){ | |
console.log('正在爬取'+url); | |
http.get(url,function(res){ | |
var html = ''; | |
res.on('data',function(data){ | |
html+=data; | |
}) | |
res.on('end',function(){ | |
resolve(html); | |
//var courseData = filterChapters(html); | |
//printCourseInfo(courseData); | |
}) | |
}).on('error',function(e){ | |
reject(e); | |
console.log('获取数据出错!') | |
}) | |
}) | |
} | |
var fetchCourseArray = []; | |
videoIds.forEach(function(id){ | |
fetchCourseArray.push(getPageAsync(baseUrl+id)); | |
}); | |
Promise | |
.all(fetchCourseArray) | |
.then(function(pages){ | |
var coursesData = []; | |
pages.forEach(function(html){ | |
var courses = filterChapters(html); | |
coursesData.push(courses); | |
}) | |
coursesData.sort(function(a,b){ | |
return a.number<b.number | |
}) | |
printCourseInfo(coursesData); | |
}); |