【问题标题】:How to make javascript fetch synchronous?如何使javascript获取同步? [复制]
【发布时间】:2017-11-27 20:58:40
【问题描述】:

我正在使用 fetch 从 api 获取数据 json。工作正常,但我必须重复使用它进行各种调用,因此它需要是同步的,否则我需要一些方法在每个组件的获取完成时更新接口。

function fetchOHLC(yUrl){
    fetch(yUrl)
    .then(response => response.json())
    .then(function(response) {
                alert(JSON.stringify(response.query));

            var t = response.created;
            var o = response.open;
            var h = response.high;
            var l = response.low;
            var c = response.close;
        
        return {t,o,h,l,c};
    
    })
    .catch(function(error) {
        console.log(error);
    });    
}

var fetchData = fetchOHLC(yUrl);
alert(fetchData); // empty ?

除了使用 fetch 之外,还有其他方法可以实现吗? (我不想用 jquery 比较好)。

谢谢

编辑

问题是关于 fetch-api,而不是 ajax,不是 jquery,所以请不要在没有正确阅读的情况下将其标记为这些问题的重复。

【问题讨论】:

    标签: javascript json asynchronous fetch-api


    【解决方案1】:

    如果您来到这里是因为您将“如何使 javascript fetch 同步”放到搜索引擎中:

    这没有多大意义。执行网络操作不需要 CPU 工作,因此在fetch(...) 期间阻止它没有什么意义。相反,请正确使用异步,如上面链接的duplicate 所示。

    问题的原始答案:

    你希望你的 fetch 函数返回某事:

    function fetchOHLC(yUrl){
        return fetch(yUrl)
        .then(response => response.json())
        .then(function(response) {
                alert(JSON.stringify(response.query));
    
            var t = response.created;
            var o = response.open;
            var h = response.high;
            var l = response.low;
            var c = response.close;
    
        return {t,o,h,l,c};
    
        })
        .catch(function(error) {
            console.log(error);
        });    
    }
    

    现在 fetchData 包含一个 Promise,可以轻松使用:

    var fetchData = fetchOHLC(yUrl);
    fetchData.then(alert); //not empty ! its {t,o,h,l,c}
    

    如果你想要一些花哨的 ES7,你可以像这样重写整个东西:

    async function fetchOHLC(yUrl) {
      try {
        const res = await ( await fetch(yUrl) ).json();
        alert(JSON.stringify(r.query));
        return {t:r.created,o:r.open,h:r.high,l:r.low,c:r.close};
      } catch(e) { console.log(e); }
    }
    
    (async function () {
      const fetchData = await fetchOHLC(yUrl);
      alert(fetchData);
    })()
    

    【讨论】:

    • 这提供了关于问题可能被误导的合理建议,但没有回答问题。
    • 我不是专家,但是如果没有 api 中绝对需要的(初始)值,其余的 javascript 没有任何意义?
    • 我知道我在评论一个四年前的问题,但在极少数情况下,发出同步 Web 请求是有意义的,并且在我看来是合法的。例如,我正在发出同步 Web 请求以下载存储在静态文件(例如 settings.json)中的 API(client_id 和权限)所需的 OAuth 设置。该文件也可以使用缓存控制进行大量缓存。 MDN Web Docs 解释了如何做到这一点:developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
    • 是的,这是一个糟糕的答案,很遗憾堆栈溢出社区充满了这么多和你一样想法的人。问题是“如何在 javascript 中进行同步获取请求”,您的答案没有回答,而是您选择居高临下地回答如何进行正常提取。
    • @JonasWilms XMLHttpRequest 可能已被弃用,但您的浏览器中仍有一些严格同步的浏览器 API。今天。像 WebRequest 一样,保护浏览器的唯一有效方法(拦截 SSL 无效)。如果您不想每次都使用 JavaScript 重新发明轮子(又名浏览器膨胀),您需要在该级别严格完全同步的 Web 请求。 这里不能使用异步、等待、承诺或其他回调。在所有当前的浏览器中。(Chrome 试图停止支持带有 Manifest v3 的 WebRequest。看起来 Mozilla 在这方面更聪明..)
    猜你喜欢
    • 2019-02-08
    • 2013-10-18
    • 2015-12-27
    • 2014-04-26
    • 2021-02-18
    • 2012-07-19
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多