繁体   English   中英

有没有办法在不使用事件侦听器的情况下从文本/事件流中获得单个响应?

[英]Is there a way to get a single response from a text/event-stream without using event listeners?

我正在 Google Sheets 中编写一个脚本来从 API 中检索一个值。 API 每 10 秒提供一次text/event-stream响应。 有没有一种方法可以在不使用异步函数或事件侦听器的情况下检索单个响应? 我在 JavaScript 方面不是很擅长,但是因为我在 Google 表格中工作,所以异步函数和事件侦听器似乎无法正常工作。 从我到目前为止所学到的,处理text/event-stream响应的唯一方法是使用EventSource但我无法使其与 Google Sheets 一起使用。

不过,我的目标只是从端点检索一个响应,因此我可以在 Google 表格中实现这一目标的任何方式都很棒。 这是端点,以防万一:

https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4

因为我无法在 Google Sheets 中使用EventStream ,所以我尝试使用在这里找到的 polyfil: https : //github.com/amvtek/EventSource/blob/master/dist/eventsource.js

然后运行它:

function getRplantTotal() {
  var source = new EventSource('https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4');
  
  source.addEventListener("message", function(e) {
    console.log(e.data);
  });
}

但这只是输出:

3:11:49 PM  Notice  Execution started
3:11:49 PM  Notice  Execution completed

我相信你的目标如下。

  • 您想从https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4的 URL 的 URL 中检索第 1 个值,并希望使用 Google Appssheet 中的值来使用 Google Appssheet 检索。

问题和解决方法:

当我看到https://github.com/amvtek/EventSource/blob/master/dist/eventsource.js ,似乎请求是用 XMLHttpRequest 运行的。 在 Google Apps Script 中,使用 UrlFetchApp,不能使用 XMLHttpRequest。 我认为这可能是您当前问题的原因。 但不幸的是,在当前阶段,这不能在 Google Apps Script 中使用text/event-stream类型。 当您使用 UrlFetchApp 请求您的 URL 时,它看起来像是无限循环。 这就是目前的情况。

因此,从My goal is just to retrieve one response from the endpoint though, so any way I can accomplish that in Google Sheets would be great.来看, My goal is just to retrieve one response from the endpoint though, so any way I can accomplish that in Google Sheets would be great. 和上述情况,我想提出一个解决方法。 当您在 Google 电子表格上运行脚本时,如何使用 Javascript 从 URL 检索值? Google Apps Script 可以使用对话框和侧边栏从 Javascript 端检索值。 从您的问题来看,当使用 Javascript 时,可以检索该值。 我认为这可能可以使用。 在 Google Apps 脚本中反映此解决方法时,如下所示。

示例脚本:

Google Apps 脚本端: Code.gs

请将以下脚本复制粘贴到谷歌电子表格脚本编辑器的脚本文件中。

// Please run this function.
function main() {
  SpreadsheetApp.getUi().showModalDialog(HtmlService.createHtmlOutputFromFile("index"), "sample");
}

function getValues(e) {
  const obj = JSON.parse(e); // This is the 1st value from the URL of "https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4"
  console.log(obj)
  // DriveApp.createFile("sample.txt", e); // When you use this, the retrieved value can be created as a text file.
}

Javascript 端: index.html

请将以下脚本复制并粘贴到 Google 电子表格脚本编辑器的 HTML 文件中。 请将文件名设置为index.html

Values are retrieving now. Please wait. After the values were retrieved, this dialog is automatically closed.
<script>
var source = new EventSource('https://pool.rplant.xyz/api2/poolminer2x/raptoreum/RThRfoQJg8qsoStLk7QdThQGmpbFUCtvnk/UlRoUmZvUUpnOHFzb1N0TGs3UWRUaFFHbXBiRlVDdHZua3x4');
source.addEventListener("message", function(e) {
  source.close();
  google.script.run.withSuccessHandler(google.script.host.close).getValues(e.data);
});
</script>
  • 在此脚本中,请从脚本编辑器运行main()函数。 这样,会在电子表格上打开一个对话框,并使用 Javascript 从 URL 中检索值,当检索到第一个值时,这些值将发送到 Google Apps 脚本端。 因此,您可以在getValues函数中使用检索到的值。

笔记:

  • 在此解决方法中,需要通过浏览器执行脚本。 因为使用了Javascript。 所以,请注意这一点。

  • 作为另一种解决方法,当您只能使用 Javascript 时,Sheets API 可以与 Javascript 一起使用。 Ref在这种情况下,也可以使用 Javascript 检索值并将其放入电子表格。

参考:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM