- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在加载页面时执行的函数,该函数调用其他四个函数:
// Initialise DB
await initialiseDb ();
// Synchronise server's and local db
await synchroniseClientAndServer ();
// Use the languages from the local db
addLanguagesToSelection ();
// Start synchronisation loop
synchroniseClientAndServerLoop ();
1 - dexie 数据库初始化
2-从服务器同步数据,将数据保存到本地表
3 - 使用本地表中保存的数据。
4 - 以 5 秒的间隔执行 #2 的循环
由于某些原因,它们按照#1 #3 #2和#4的顺序执行
async function initialiseDb ()
{
await database.version ( 1 ).stores ( { values_lookup: '++name, value' } );
await database.version ( 1 ).stores ( { languages: '++id, identifier, name' } );
languagesTable = await database.languages;
valuesLookupTable = await database.values_lookup;
// Set synchronisation millisecond = 0 if the database has just been created
if ( await valuesLookupTable.where ( 'name' ).equals ( "synchronisationMs" ).count () == 0 )
{
await valuesLookupTable.put ( { name : 'synchronisationMs', value : 0 } );
}
console.log ( "> 111 > valuesLookupTable initialised : " + await valuesLookupTable.where ( 'name' ).equals ( "synchronisationMs" ).count () );
console.log ( "> 112 > valuesLookupTable initialised : " + await languagesTable.count () );
}
async function synchroniseClientAndServer ()
{
var previousSyncTime = ( await valuesLookupTable.where ( 'name' ).equals ( "synchronisationMs" ).first () ).value;
var syncData = JSON.stringify ( { previousSynchronisationTime : previousSyncTime } );
var xhr = new XMLHttpRequest();
xhr.open ( "POST", service + " ClientServerSynchronisation", true );
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8" );
xhr.send ( syncData );
xhr.onreadystatechange = async function ()
{
// Redirect to home page if sessioin is not active
if ( this.status === 418 )
{
goHome ();
}
else if ( this.readyState === 4 && this.status === 200 )
{
var syncData = JSON.parse ( xhr.responseText );
// Update last synchronisation time for the next request
await database.values_lookup.put ( { name : 'synchronisationMs', value : syncData.synchronisationTime } );
// Update the list of languages with newly added and deleted
var updatedLanguages = syncData.updatedLanguages;
for ( var index = 0; index < updatedLanguages.length; index = index + 1 )
{
var language = updatedLanguages [ index ];
if ( language.addedOrDeleted === ADDED )
{
await languagesTable.put ( { id : language.id, identifier : language.identifier, name : language.name } );
console.log ( "> 200 > valuesLookupTable initialised : " + await languagesTable.count () );
}
else
{
await languagesTable.delete ( language.id );
console.log ( "> 200 > valuesLookupTable initialised : " + await languagesTable.count () );
}
}
}
};
}
async function addLanguagesToSelection ()
{
console.log ( "> 300 > " );
var selector = ge ( "languageId" );
var languages = await languagesTable.toArray ();
....
}
上面的语言表是包含语言的表
结果是这样的:
> 111 > valuesLookupTable initialised : 1 desktop_js.jsp:720:13
> 112 > valuesLookupTable initialised : 0 desktop_js.jsp:721:13
> 300 > desktop_js.jsp:501:10
> 200 > valuesLookupTable initialised : 1 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 2 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 3 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 4 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 5 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 6 desktop_js.jsp:409:17
> 200 > valuesLookupTable initialised : 7 desktop_js.jsp:409:17
因此语言不会出现,因为列表是在加载数据之前填充的。我知道问题可能是由于 dexie db 是异步的,但我几乎在所有地方都添加了“await”,并且它一直是我迄今为止遇到的所有问题的解决方案。
有人能发现我做错了什么吗?
谢谢!
最佳答案
查看您的代码,我最初的想法是您的 synchroniseClientAndServer()
在 addLanguagesToSelection()
之前完成。 但是,在 synchroniseClientAndServer()
内部,您有 xhr.onreadystatechange
,它是异步的,在程序的其余部分继续运行时等待服务器响应。
本质上,顺序是这样运行的:#1, #2, #3, #2.1 (xhr.onreadystatechange
), #4。
一种解决方案可能是从 xhr.onreadystatechange
内部调用 addLanguagesToSelection()
。
关于使用 dexie db 时以意外顺序调用 Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825325/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!