javascript - 如何调用异步 JavaScript 函数并阻止原始调用者

标签 javascript blocking

我有一个有趣的情况,我通常聪明的头脑无法想出解决方案 :) 这是情况...

我有一个具有 get() 方法的类...调用此方法来获取存储的用户首选项...它所做的是调用一些底层提供程序来实际获取数据...如现在所写,它正在调用一个与 cookie 对话的提供者……所以,get() 调用 providerGet() 比方说,providerGet() 返回一个值,然后 get() 将它传递给调用者。显然,调用者希望在继续工作之前得到响应。

这是棘手的部分...我现在正在尝试实现一个本质上是异步的提供程序(在这种情况下使用本地存储)...因此,providerGet() 会立即返回,并已向本地发送调用存储将在一段时间后调用传递给它的回调函数......但是,由于 providerGet() 已经返回,现在通过扩展对原始调用的 get() 也返回了,它显然没有返回实际检索到的数据。

所以,问题很简单,是否有一种方法可以基本上“阻止”从 providerGet() 返回直到异步调用返回?请注意,出于我的目的,我并不关心这可能带来的性能影响,我只是想弄清楚如何让它发挥作用。

我不认为有什么办法,当然我知道我还没有想出它......所以我想把它扔出去看看其他人能想出什么:)

编辑:我现在才知道问题的核心,即 Web sql API 是异步的这一事实,可能有一个解决方案……原来还有一个同步版本的 API,我没有没意识到...我现在正在阅读文档以了解如何使用它,但这会很好地解决问题,因为 providerGet() 被异步编写的唯一原因是允许该提供程序...代码get() 是我自己的抽象层的一部分,位于各种存储提供程序(cookie、web sql、localStorage 等)之上,因此最低公分母必须取胜,这意味着如果一个是异步的,那么它们都必须是异步的。 . 唯一的一个是 web sql... 所以如果有一种方法可以同步地做到这一点,我的观点就没有实际意义了(尽管我认为这仍然是一个有趣的问题)

edit2:啊好吧,似乎没有帮助......似乎 API 的同步版本没有在任何浏览器中实现,即使指定它只能从工作线程使用,所以这个反正好像也没什么用。虽然,阅读其他一些东西听起来好像有一种方法可以使用递归来实现这个技巧......我现在正在整理一些测试代码,如果/当我开始工作时我会发布它,看起来很有趣一般地解决任何此类情况的方法。

edit3:根据我在下面的评论,确实没有办法完全按照我的意愿去做。我要解决我眼前问题的解决方案是简单地不允许使用 web SQL 进行数据存储。这不是理想的解决方案,但由于该规范在不断变化并且没有得到广泛实现,所以它不是世界末日......希望当它得到适当支持时同步版本将可用并且我可以为其插入一个新的提供者并且可以开始了。不过一般来说,似乎没有任何方法可以实现这个奇迹……证实了我的预期,但希望这一次我错了:)

最佳答案

生成一个 webworker 线程来为您执行异步操作。 传递它完成任务所需的信息以及唯一的 ID。 诀窍是让它在完成时将结果发送到网络服务器。

与此同时...生成 webworker 的函数向同一个 web 服务器发送一个 ajax 请求 使用 xmlhttprequest 对象的同步标志(是的,它有一个同步选项)。因为它会阻塞直到 http 请求完成,所以您可以让您的网络服务器脚本轮询数据库以获取更新或其他任何内容,直到结果发送给它为止。

丑陋的,我知道。但它会在不占用 CPU 的情况下阻塞 :D

基本上

function get(...) {
    spawnWebworker(...);
    var xhr = sendSynchronousXHR(...);
    return xhr.responseTEXT;
}

关于javascript - 如何调用异步 JavaScript 函数并阻止原始调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8448218/

相关文章:

javascript - Firebase.update 失败 : first argument contains undefined in property

java - 读取套接字输入流而没有传输结束字符?

go - 在 select 语句中使用 Reader 接口(interface)时的约定

c - 处理程序的阻塞信号

javascript - 想要同时使用 browserAction 和 pageAction

javascript - 在 Node.js 中提供 .html 文件时,如何在单独的目录中获取源文件以在 .html 文件中使用?

javascript - react native : Image Not Showing

c - 阻塞管道,c,linux

multithreading - Haskell 计算密集型线程阻塞所有其他线程

javascript - 在 Javascript 中使用 new 和不使用它一样吗?