我遇到了一个有趣的情况,即使我通常聪明的头脑也无法想出解决方案:)以下是情况描述...
我有一个类,其中包括一个get()方法...调用此方法以获取用户存储的首选项...它会调用一些基础提供程序来实际获取数据...如今,它正在调用一个涉及cookie的提供程序...因此,get()调用providerGet()(例如),providerGet()返回一个值,然后get()将其传递给调用者。显然,在继续工作之前,调用者需要响应。
这里是棘手的部分...我现在正试图实现一个异步的提供程序(在这种情况下使用本地存储)...因此,providerGet()会立即返回,并分派一个调用回调函数的本地存储调用,稍后将调用该函数...但是,由于providerGet()已经返回,而且get()也随之扩展到最初的调用方,显然它还没有返回实际检索到的数据。
因此,问题很简单,是否有一种方法可以阻止providerGet()的返回,直到异步调用返回?请注意,出于我的目的,我不关心这可能产生的性能影响,我只是试图弄清楚如何使其工作。
我认为没有办法,当然我知道我自己也想不出来...所以我想看看其他人能想出什么 :)
编辑:我现在才知道问题的核心,即Web SQL API是异步的事实,可能有一个解决方案......原来还有API的同步版本,这是我没有意识到的...我正在阅读文档,看看如何使用它,但这会很好地解决问题,因为providerGet()被编写成异步的唯一原因是为了允许该提供程序...get()所在的代码是我自己的抽象层,位于各种存储提供程序(cookie、Web SQL、localStorage等)之上,所以最低公共分母必须获胜,这意味着如果其中一个是异步的,它们都必须是异步的...唯一异步的是Web SQL...所以如果有一种方法可以同步进行,我的观点就无效了(尽管我认为这仍然是一个有趣的泛型问题)。
编辑2:啊,好像没有帮助......似乎API的同步版本没有在任何浏览器中实现,即使它被实现了,规定它只能从工作线程中使用,所以这似乎也不能帮助。不过,阅读其他一些内容,听起来有一种递归的方法可以完成这个技巧...我正在组合一些测试代码,如果/当我使它正常工作,我会发布它,似乎是一种非常有趣的方法来通用地解决这种情况。
编辑3:根据我下面的评论,没有办法完全做到我想要的。我正在采取的解决我的直接问题的方法是根本不允许使用Web SQL进行数据存储。这不是理想的解决方案,但由于该规范正在变化,并且不被广泛实现,因此这并不是世界末日...希望在其得到适当支持时将提供同步版本,我可以插入一个新的提供程序,并且很好地工作。一般地说,似乎没有任何方法可以完成这个奇迹......证实了我所预料的情况,但我希望这次我能错。