如何使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 中进行同步获取请求”,您的答案没有回答,而是您选择居高临下地回答如何进行正常提取。 @JonasWilmsXMLHttpRequest
可能已被弃用,但您的浏览器中仍有一些严格同步的浏览器 API。今天。像 WebRequest 一样,保护浏览器的唯一有效方法(拦截 SSL 无效)。如果您不想每次都使用 JavaScript 重新发明***(又名浏览器膨胀),您需要在该级别严格完全同步的 Web 请求。 这里不能使用异步、等待、承诺或其他回调。在所有当前的浏览器中。(Chrome 试图停止支持带有 Manifest v3 的 WebRequest。看起来 Mozilla 在这方面更聪明..)以上是关于如何使javascript获取同步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何对服务器进行 JavaScript 同步调用? [复制]