promise 使用
首先看下回调地狱!
// 在这里我准备去发送异步请求
// 1,先去获取1.txt 中的内容,若成功了,就再去获取2.txt 中的内容!
//,引入jQuery ,用它封装的 ajax 去写代码
// 由于我对 jQuey ajax 还不太熟悉,所以我去查下!
// 以下就是回调里面套回调,形成回调地狱
<head>
<meta charset="UTF-8">
<title>test</title>
<script src="jQuery.js" type = "text/javascript"></script>
</head>
<body>
<button id = "oBtn">我的 热情,好像 一把火</button>
<p>爱生活,爱编程</p>
<script>
// $.ajax({ url: "test.html", context: document.body, success: function(){
// $(this).addClass("done");
// }});
window.onload = function(){
var oBtn= document.getElementById('oBtn')
var oText = document.getElementsByTagName('p')[0]
oBtn.onclick = function(){
// 在这里我准备去发送异步请求
// 1,先去获取1.txt 中的内容,若成功了,就再去获取2.txt 中的内容!
//,引入jQuery ,用它封装的 ajax 去写代码
// 由于我对 jQuey ajax 还不太熟悉,所以我去查下!
// 以下就是回调里面套回调,形成回调地狱
$.ajax({
url:'1.txt',
success(str){
console.log('successget ')
//在这边能不错的去获取数据
console.log(str)
$.ajax({
url:'2.txt',
success(str2){
oText.innerHTML= str2
}
})
},
error(err){
console.log('获取数据失败')
console.log(err)
}
});
}
}
</script>
</body>
以上就是回调里套一个回调, 我 请求数据用的 是 jQuery 的ajax
好 现在来了, 上面是异步的写法, 怎么写成 同步的操作呢!那么Promise 就来了
let p1 = new Promise(function(resolve,reject){
$.ajax({
url:'1.txt',
success(str){
resolve(str)
}
})
})
p1.then(function(str){
console.log(str)
$.ajax({
url:'2.txt',
success(str2){
console.log(str2)
}
})
})
以上是 Promise 写法,是不是稍微有 点不一样,其实我告诉你, promise 的理解,就是用同步的写法完成异步的操作
语法糖的功能
上面还是 看 不出优势, 我加入有 多次 异步呢? 我思考下哈!
修改的代码如下:
let p1 = new Promise(function(resolve,reject){
$.ajax({
url:'1.txt',
success(str){
resolve(str)
}
})
})
p1.then(function(str){
// 第一请求,得到的结果
console.log(str)
return new Promise(function(resolve,reject){
$.ajax({
url:'2.txt',
success(str2){
resolve(str2)
}
})
})
}).then(function(str2){
// 第二次请求得到的结果!
console.log(str2)
//再这里 可以去进行第三次请求!!
})
}
这个就可以无限 用,同步方式 去 写异步代码了,就是说
在 then 方法中,返回一个 Promise 对象就可以无限then 下去,
假如 , 有 10 来个 回调,用 这个 写起来不就很好看,
既有同步的 写法,又能得到异步的结果, 很不错!
上面的代码还是有 问题的,因为jQuery ajax 方法本身就返回 Promise 实例!
我先给大家补充下 jQuery ajax 写法!
var p2 = $.ajax({
url:'1.txt',
dataType:'text'
})
console.log(p2)
上面的p2 就是Promise 对象, (对象== 实例) 只是叫法 不同, 相信 学过java 的同学 都知道,以后我会
来回替换叫!
最终写法是 这个样子:
$.ajax({
url:'1.txt',
dataType:'text'
}).
then(data1=>{
console.log(data1)
return $.ajax(
{
url:'2.txt',
dataType:'text'
})
}).
then(str2=>{
console.log(str2)
})
相信经过上面的代码,大家已经 深刻的明白了promise 的用法了,可见 es6 就是为了让大家写代码写起来简单
反正最后还得编译成es 5 这个我就不扯了!
genertor 的 使用 我 再单写一篇