Files
leporello-js/src/patch_promise.js

54 lines
1.3 KiB
JavaScript
Raw Normal View History

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
}
2022-12-17 13:55:37 +08:00
class PromiseWithStatus extends window.Promise {
2022-12-02 04:13:32 +08:00
constructor(fn) {
2022-12-16 21:43:07 +08:00
let status
let is_constructor_finished = false
2022-12-17 13:55:37 +08:00
const p = new window.Promise.Original(
2022-12-16 21:43:07 +08:00
(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
}
}
2022-12-17 13:55:37 +08:00
PromiseWithStatus.Original = window.Promise
2022-12-02 04:13:32 +08:00
window.Promise = PromiseWithStatus
}