首页 > 解决方案 > 使 fetch 调用真正同步

问题描述

是的,我想完全同步。我知道它会完全停止我唯一的线程,但我真的需要它,因为我使用了一些我不想更改的 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;
    }
}

这就是我的函数的调用方式:

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 那么我的 func 返回Promise而不是令牌,如果我使用open with true (async),那么我得到undefined不推荐使用带有false (完全同步)的变体,所以我想用 fetch API 做同样的事情。

// 编辑 //

那么,我怎样才能完全同步地执行onNonce函数(fetchresponse.json())?

标签: javascript

解决方案


你不能。

fetch没有同步运行的选项(出于同样的原因,同步运行 XHR 的选项一开始就被弃用了)。

改为学习如何await正确使用。


推荐阅读