2022-12-02 04:13:32 +08:00
|
|
|
export const patch_promise = window => {
|
2022-12-16 21:43:07 +08:00
|
|
|
|
2022-12-02 04:13:32 +08:00
|
|
|
if(window.Promise.Original != null) {
|
2022-12-07 05:06:15 +08:00
|
|
|
// already patched
|
|
|
|
|
return
|
2022-12-02 04:13:32 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class PromiseWithStatus extends Promise {
|
|
|
|
|
constructor(fn) {
|
2022-12-16 21:43:07 +08:00
|
|
|
let status
|
|
|
|
|
let is_constructor_finished = false
|
|
|
|
|
const p = new Promise.Original(
|
|
|
|
|
(resolve, reject) => {
|
|
|
|
|
fn(
|
|
|
|
|
(value) => {
|
|
|
|
|
if(value instanceof window.Promise.Original) {
|
|
|
|
|
value
|
|
|
|
|
.then(v => {
|
|
|
|
|
p.status = {ok: true, value: v}
|
|
|
|
|
resolve(v)
|
|
|
|
|
})
|
|
|
|
|
.catch(e => {
|
|
|
|
|
p.status = {ok: false, error: e}
|
|
|
|
|
reject(e)
|
|
|
|
|
})
|
|
|
|
|
} else {
|
|
|
|
|
status = {ok: true, value}
|
|
|
|
|
if(is_constructor_finished) {
|
|
|
|
|
p.status = status
|
|
|
|
|
}
|
|
|
|
|
resolve(value)
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
(error) => {
|
|
|
|
|
status = {ok: false, error}
|
|
|
|
|
if(is_constructor_finished) {
|
|
|
|
|
p.status = status
|
|
|
|
|
}
|
|
|
|
|
reject(error)
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
is_constructor_finished = true
|
|
|
|
|
p.status = status
|
2022-12-16 13:15:27 +08:00
|
|
|
return p
|
2022-12-02 04:13:32 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PromiseWithStatus.Original = Promise
|
|
|
|
|
|
|
|
|
|
window.Promise = PromiseWithStatus
|
|
|
|
|
}
|