【问题标题】:How to write async fetch() without async?如何在没有异步的情况下编写异步 fetch()?
【发布时间】:2019-12-16 22:38:01
【问题描述】:

我有一行代码使用await fetch()。我正在使用一些脚本注入来调用 eval("await fetch ...etc..." ),但问题是 awaiteval() 调用。

因此,我们的目标是使用await重写这一行。该怎么做?

( await fetch( ff_url, ff_params ) )
                                  .json()
                                  .then( data => window.items_list = data.items );

Upd:此代码与 AutoHotkey 一起使用。无需将行拆分为两行(在 JavaScript 或 AutoHotkey 中均不拆分)以检查 fetch 是否已经完成,因为在我的情况下(AutoHotkey + JS)我认为定期验证 window.items_list 是否有值或仍然更简单未定义:D

附:感谢您的回答,它工作正常!

【问题讨论】:

  • 你能发布更多的代码上下文吗?您是否希望 eval 命令等到提取完成后再进入下一行?
  • Responses from this question 可以帮到你:)
  • @CertainPerformance,更新了帖子:这是通过 AutoHotkey 进行的注入。因此,我确定不需要将行分成两个 eval - 在 fetch 完成之前和之后 - 因为无论如何(直到不支持 await)我都需要手动验证 window.items_list 的值,如下所示: loop { if(PageInst.Evaluate("typeof window.items_list === 'undefined'").Value == false) { break } Sleep, 150 }
  • @UlysseBN 谢谢,我会读到的:D 目前,Promises 和 operator => 对我来说是最困难的话题,除了回调 :)

标签: javascript promise async-await fetch autohotkey


【解决方案1】:

如果问题仅仅是你不能标记方法async,那么标准的promise语法就可以了:

fetch(ff_url, ff_params)
    .then(x => x.json())
    .then(data => window.myvariable = data.items);

当然,您仍然应该确保调用者异步调用它并适当地处理结果(除非需要触发并忘记)。

【讨论】:

  • 谢谢,它有效!我将把它与验证 window.myvariable 是否已经有一个值(在 AutoHotkey 中)结合起来。
  • 确保你理解这个函数是异步的并且返回一个不完整的promise。通常,您需要等待该承诺,然后再采取进一步行动。 window.myvariable 在这段代码执行时不会立即有值,只有在返回的承诺完成后才会有值。
  • 当然,我明白 :D 由于别名 AutoHotkey+Chrome,无法应用 then() 功能。相反,在 fetch() AutoHotkey 之后每隔 100 毫秒执行一次 while( window.hasOwnProperty( 'myvariable' ) ),并且只有在此之后 AutoHotkey 才会继续。
【解决方案2】:

如果你想强制函数同步运行,你可以使用sync-rpc 模块。这是一个方便的 sn-p,用于强制基于承诺的异步库/函数同步运行。

这是通过使用spawnSync 生成child_process 来实现的。

const forceSync = require('sync-rpc')
const syncFunction = forceSync(require.resolve('./async-thing'))

// inside your thing that needs to be sync (for whatever reason)
const paramOne = 'foo'
const paramTwo = 'bar'
console.log('start')
const syncReturn = syncFunction(paramOne, paramTwo)
console.log('syncReturn', syncReturn)
// result after 2 seconds
// { one: `foo-value`, two: `bar-value` }

// 用syncReturn 值做剩下的事情

【讨论】:

  • 这是大错特错!尝试 forceSync 应该(几乎)永远不会成为 Javascript 的座右铭。在浏览器中,它会冻结用户的网站,在 node.js 后端,好吧,如果你不想处理 javascript 的异步特性,只需使用另一种语言。
  • 它必须在 Node.js 中运行吗?据我所知,浏览器不支持require()。抱歉,我无法完全理解这段代码......我的代码是通过 AutoHotkey 启动的,它与调试模式 Chrome 连接。无论如何,我们已经有了一个解决方案:JavaScript 部分是 fetch(ff_url, ff_params).then(x => x.json()).then(data => window.items_list = data.items);,Autohotkey 部分是 loop { if( PageInst.Evaluate( "typeof window.items_list === 'undefined'" ) ).Value == false ) { break } Sleep, 150 }
猜你喜欢
  • 2019-11-26
  • 2017-03-05
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多