1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use js_sys::Function;
use js_sys::Promise;
use wasm_bindgen::prelude::*;

/// Deferred promise - an object that has `resolve()` and `reject()`
/// functions that can be called outside of the promise body.
#[wasm_bindgen]
pub fn defer() -> Promise {
    Function::new_no_args(
        r###"
        let resolve, reject;
        const p = new Promise((resolve_, reject_) => {
            resolve = resolve_;
            reject = reject_;
        });
        p.resolve = resolve;
        p.reject = reject;
        return p;
    "###,
    )
    .call0(&JsValue::undefined())
    .unwrap()
    .into()
}