使获取呼叫真正同步

时间:2018-10-31 16:48:58

标签: javascript

是的,我想完全同步。我知道它将完全停止我的一个线程,但我确实需要这样做,因为我使用了一些我不想更改的SDK,因此在此SDK中,您需要传递一个将被调用且将更改的函数像这样的一些价值:

function onNonce(stuff) {
    const url = 'fancy url to change stuff';

    // await also doesn't work

    // const response = await fetch(url);
    // const resp_json = await response.json();
    // return resp_json.token;

    // await also doesn't work

    const req = new XMLHttpRequest();
    req.open("GET", url, false); // <-- completely sync and deprecated
    req.send();

    if(req.readyState === 4 && req.status === 200) {
        return req.response.token;
    }
}

这就是我的func的称呼方式:

function SDK(result) {
    //
    // SOME FANCY CODE
    //

    var the_value_to_change;

    the_value_to_change = onNonce('some stuff');
    console.log("async");

    //
    // SOME FANCY CODE that uses this the_value_to_change
    //
}

如果我使用await,那么我的函数将返回 Promise (而不是令牌),并且如果我将 open true(异步)一起使用,则我得到未定义。带有 false(完全同步)的变体已弃用,因此我想使用访存API进行相同的操作。

//编辑//

那么,如何完全同步执行 onNonce 函数(获取 response.json())?

2 个答案:

答案 0 :(得分:0)

你不能。

fetch没有可以同步运行的选项(出于相同的原因,首先不赞成使用XHR同步运行)。

Learn how to use await properly instead

答案 1 :(得分:0)

function onNonce() {
    const url = 'fancy url to change stuff';
    return new Promise(function (resolve, reject) {
        const req = new XMLHttpRequest();
        req.open('GET', 'url', true);
        req.onreadystatechange = function () {
            if (req.readyState === 4 && req.status === 200) {
                resolve(req.responseText);
            }
        };
        req.send();
    });
}

async SDK() {
    var the_value_to_change;
    the_value_to_change = onNonce();
    let result = await the_value_to_change;
}

这应该有效。您必须使用值来解析Promise