promise
1.问题的产生
- 1.问题的产生
function req(url) {
setTimeout(() => {
if (url === 'favo.ico') {
return 'suc'
} else {
return 'err'
}
}, 3000);
}
const res = req('favo.ico')
console.log("🚀 ~ res:", res)
- 2.最初的解决方法
function req(url, suc, err) {
setTimeout(() => {
if (url === "favo.ico") {
suc()
} else {
err()
}
}, 1000)
}
function suc() {
console.log("suc")
}
function err() {
console.log("err")
}
req("favo.icon", suc, err)
2.promise引入
- 1.引入
const pro = new Promise((resolve, reject) => {
console.log("立即执行")
})
- 2.重构问题的函数
function req(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url === "favo.icon") {
resolve("suc")
} else {
reject("err")
}
}, 1000)
})
}
req("favo.icon")
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
- 3.promise的状态
- 4.resolve传入不同值的区别
const pro = new Promise((resolve, reject) => {
resolve({ name: "a", age: 1 })
})
pro.then((res) => {
console.log(res)
})
const pro = new Promise((resolve, reject) => {
resolve(
new Promise((resolve, reject) => {
resolve("aaa")
})
)
})
pro
.then((res) => {
console.log("🚀 ~ pro.then ~ res:", res)
})
.catch((err) => {
console.log("🚀 ~ err:", err)
})
const pro = new Promise((resolve, reject) => {
resolve({
then(resolve, reject) {
reject("a")
},
})
})
pro
.then((res) => {
console.log("🚀 ~ pro.then ~ res:", res)
})
.catch((err) => {
console.log("🚀 ~ err:", err)
})
- 5.promise的实例方法
- 5.1.then
const promise = new Promise((resolve, reject) => {
resolve("a")
reject("b")
})
promise.then(
(res) => {},
(rej) => {}
)
const pro = new Promise((resolve, reject) => {
reject("b")
})
pro.then(null, (rej) => {
console.log(rej)
})
const pro = new Promise((resolve, reject) => {
resolve("a")
})
pro
.then((res) => {
console.log(res)
})
.then((res) => console.log(res))
const pro = new Promise((resolve, reject) => {
resolve("a")
})
pro
.then((res) => {
return new Promise((resolve, reject) => {
reject("b")
})
})
.then((res) => console.log(res))
.catch((rej) => {
console.log(rej)
})
const promise = new Promise((resolve, reject) => {
resolve("a")
})
promise
.then((res) => ({
then(resolve, reject) {
resolve("b")
},
}))
.then(
(res) => {
console.log("🚀 ~ promise.then ~ res:", res)
},
(rej) => {
console.log("🚀 ~ promise.then ~ rej:", rej)
}
)
- 5.2catch
const promise = new Promise((resolve, reject) => { reject() })
promise.catch(() => 1).then((res) => { console.log(res) })
const promise = new Promise((resolve, reject) => { reject('1') })
promise.catch((res) => { return new Promise((resolve, reject) => { resolve(res) }) }).then(res => { console.log(res); })
promise.catch((res) => { return new Promise((resolve, reject) => { reject(res) }) }).catch(res => { console.log(res); })
const promise = new Promise((resolve, reject) => { reject('1') })
promise.catch((res) => ({ then(resolve, reject) { resolve(res) } })).then(res => { console.log(res); })
promise.catch((res) => ({ then(resolve, reject) { reject(res) } })).catch(res => { console.log(res); })
- 5.3.finally
const promise = new Promise((resolve, reject) => {
resolve('1')
})
promise.then((res) => console.log(res)).finally(() => { console.log('finally'); })
- 6.Promise上的类(静态)方法
- 6.1.resolve/reject
Promise.resolve('a').then(res => console.log(res))
Promise.reject('b').then('', rej => console.log(rej))
- 6.2.all
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(1) }, 1000)
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(2) }, 2000)
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(3) }, 3000)
})
Promise.all([promise1, promise2, promise3]).then((res) => console.log(res))
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(1) }, 1000)
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => { reject(2) }, 2000)
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(3) }, 3000)
})
Promise.all([promise1, promise2, promise3]).then((res) => console.log(res)).catch(rej => console.log(rej))
-6.3.allSettled
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(1) }, 1000)
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => { reject(2) }, 2000)
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(3) }, 3000)
})
Promise.allSettled([promise1, promise2, promise3]).then((res) => console.log(res)).catch(rej => console.log(rej))
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => { resolve(1) }, 1000)
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => { reject(2) }, 2000)
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => { }, 3000)
})
Promise.allSettled([promise1, promise2, promise3]).then((res) => console.log(res)).catch(rej => console.log(rej))
- 6.4.race
const promise1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(1)
}, 1000)
})
const promise2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 2000)
})
const promise3 = new Promise((resolve, reject) => {
setTimeout(() => { }, 3000)
})
Promise.race([promise1, promise2, promise3])
.then((res) => console.log(res, "then"))
.catch((rej) => console.log(rej, "catch"))
- 6.5.any
const pro1 = new Promise((resolve, reject) => {
setTimeout(() => {
reject(1)
}, 1000)
})
const pro2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(2)
}, 2000)
})
const pro3 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(3)
}, 3000)
})
Promise.any([pro1, pro2, pro3])
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err)
})
3.回调地狱
- 1.回调地狱的产生
function request(params) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (params.includes("ice")) {
resolve("suc")
} else {
reject("err")
}
}, 200)
})
}
request('ice.icon').then(res => {
request(`ice${res}`).then(res => {
request(`ice${res}`).then(res => {
console.log(res);
})
})
})
request('ice.icon').then(res => {
return request(`ice${res}`)
}).then(res => {
return request(`ice${res}`)
}).then(res => {
console.log(res);
})
- 2.使用生成器+promise
function request(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url.includes("i")) {
resolve(url)
} else {
reject("失败")
}
}, 1000)
})
}
function* getData(params) {
const res1 = yield request(params)
const res2 = yield request(res1)
const res3 = yield request(res2)
}
const generate = getData("icon")
generate.next().value.then((res1) => {
generate.next(`i${res1}`).value.then((res2) => {
generate.next(`i${res2}`).value.then((res3) => {
generate.next(res3)
})
})
})
function request(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url.includes("i")) {
resolve(url)
} else {
reject("失败")
}
}, 1000)
})
}
function* getData() {
const res1 = yield request("i1")
const res2 = yield request("i2" + res1)
const res3 = yield request("i3" + res2)
console.log(res3)
}
function asyncAuto(fn) {
const generate = fn()
const _auto = (result) => {
const nextData = generate.next(result)
const { done, value } = nextData
if (done) return
value.then((res) => {
_auto(res)
})
}
_auto()
}
asyncAuto(getData)
function request(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url.includes("i")) {
resolve(url);
} else {
reject("失败");
}
}, 1000);
});
}
async function getData() {
const res1 = await request('i1')
const res2 = await request('i2' + res1)
const res3 = await request('i3' + res2)
console.log(res3);
}
getData()
4.async/await
async function hi() {
console.log(res);
}
hi().catch(err => { console.log(err); })
async function hi() {
try {
console.log(res)
} catch (error) {
console.log(error)
}
}
hi()
function request(url) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (url.includes("i")) {
resolve(url);
} else {
reject("失败");
}
}, 1000);
});
}
const getReq = async () => {
try {
const res = await request('zz')
console.log("🚀 ~ getReq ~ res:", res)
} catch (error) {
console.log("🚀 ~ getReq ~ error:", error)
}
}
5.手写相关
1.all
Promise.myAll = function (params) {
return new Promise((resolve, reject) => {
let count = 0
let completeCount = 0
let result = []
for (const iterator of params) {
let i = count
count++
Promise.resolve(iterator).then(
(res) => {
result[i] = res
completeCount++
if (completeCount === count) {
resolve(result)
}
},
(err) => reject(err)
)
}
if (count === 0) {
resolve(params)
}
})
}
2.超时
function req() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("发送请求")
}, 4000)
})
}
function overSettimeout() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject("超时")
}, 3000)
})
}
Promise.race([req(), overSettimeout()]).then(
(res) => {
console.log(res)
},
(err) => {
console.log(err)
}
)
function req() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("发送请求")
}, 4000)
})
}
const promiseSetTimeout = (p) => {
let timer = null
const over = new Promise((resolve, reject) => {
timer = setTimeout(() => {
reject("超时")
}, 3000)
})
return Promise.race([p(), over])
}
promiseSetTimeout(req)
.then((res) => {
console.log(res)
})
.catch((err) => {
console.log(err, "err")
})