如何使javascript获取同步? [复制]

Posted

技术标签:

【中文标题】如何使javascript获取同步? [复制]【英文标题】:How to make javascript fetch synchronous? 【发布时间】: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,所以请不要在没有正确阅读的情况下将其标记为这些问题的重复。

【问题讨论】:

【参考方案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 在这方面更聪明..)

以上是关于如何使javascript获取同步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

javascript中复制对象的乐观同步

如何使ajax同步? [复制]

如何对服务器进行 JavaScript 同步调用? [复制]

如何使变量/对象在 Javascript 中只读? [复制]

处理多个文件时如何使inotify等待

如果不存在,如何使 Javascript 参数默认为某个值? [复制]