输出顺序
console.log(2);
let doit;
const prom = new Promise((resolve, reject) => {
console.log(3)
doit = resolve;
console.log(6)
});
prom.then(n => console.log(4));
async function s1() {
console.log(7)
await s2();
console.log(1)
doit();
setTimeout(() => {
console.log('a')
}, 0)
console.log(8);
}
async function s2() {
console.log(9)
}
s1();
console.log(5);
prom.then(n => console.log(10));
// results: 2 3 6 7 9 5 1 8 4 10 a
Promise.resolve()
.then(() => {
console.log(0)
return Promise.resolve(4)
})
.then(res => {
console.log(res)
})
Promise.resolve()
.then(() => {
console.log(1)
})
.then(() => {
console.log(2)
})
.then(() => {
console.log(3)
})
.then(() => {
console.log(5)
})
.then(() => {
console.log(6)
})
// 0 1 2 3 4 5 6
Promise.all
function promiseAll(pList) {
return new Promise((resolve, reject) => {
const results = []
let count = 0
for (let i = 0; i < pList.length; i++) {
pList[i]
.then(data => {
results[i] = data
count++
if (count === pList.length) {
resolve(results)
}
})
.catch(err => {
reject(err)
})
}
})
}
Promise.race
function promiseRace(pList) {
return new Promise((resolve, reject) => {
const promiseLength = pList.length
if (promiseLength === 0) {
return resolve()
} else {
for (let i = 0; i < promiseLength; i++) {
Promise.resolve(pList[i]).then(
value => resolve(value),
reason => reject(reason)
)
}
}
})
}
catch、finally、resolve、reject
class Promise {
catch(onRejected) {
return this.then(undefined, onRejected)
}
finally(onFinally) {
return this.then(
data => {
onFinally()
return data
},
err => {
onFinally()
throw err
}
)
}
static resolve(value) {
if (value instanceof Promise) return value
return new Promise(resolve => {
resolve(value)
})
}
static reject(reason) {
return new Promise((resolve, reject) => {
reject(reason)
})
}
}