在下面的代码中,
Promise.allSettled( [ entry_save(), save_state(), get_HTML() ] ).then( ... );
承诺
entry_save
和
save_state
都是
readwrite
数据库事务和
get_HTML
是
readonly
.两个
读写
事务可以组合在一起,但这会使维护的撤销/重做链变得复杂,并将两个事务的成功和回滚联系在一起,这是不希望的。
这个
输入保存
事务需要在
拯救国家
交易搬家前
输入保存
进入
Promise.allSettled
这就是它的工作原理,因为
输入保存
交易是在其他交易之前创建的。这
MDN article
解释执行请求的顺序如何基于独立于请求的顺序创建事务的时间。
我的问题是,每个promise的同步代码是否按照它在数组中的放置顺序进行处理,例如
输入保存
first始终会导致首先创建其事务,并保证首先执行其数据库请求?
虽然它很有效,速度也很快,但我不想这样做:
entry_save().then( () => { Promise.allSettled( [ save_state(), get_HTML() ] ) } ).then( ... );
如果这很重要的话,那并不是它的写作方式,它更符合:
entry_save().then( intermediate );
哪里
intermediate
调用
许诺一切都解决了
.
非常感谢。
为了澄清一点,下面是上面引用的MDN文档中给出的示例。
var trans1 = db.transaction("foo", "readwrite");
var trans2 = db.transaction("foo", "readwrite");
var objectStore2 = trans2.objectStore("foo")
var objectStore1 = trans1.objectStore("foo")
objectStore2.put("2", "key");
objectStore1.put("1", "key");
After the code is executed the object store should contain the value "2", since trans2 should run after trans1.
如果
输入保存
创造
trans1
和
拯救国家
创造
trans2
,都在函数的同步代码中,这意味着不在
onsuccess
或
onerror
数据库请求或类似事件的处理程序,MDN示例是否适用?
因此,@jfriend00写道,
函数按其在数组中的放置顺序调用,
但这只决定了异步操作的顺序
起动。
由于事务是在异步代码开始之前在同步代码中创建的,因此这会按事务创建的时间顺序排列写请求的时间吗?
我想测试一下,但我不确定如何测试。如果一次使用两个几乎相同的承诺
许诺一切都解决了
,如何延迟第一个创建的事务的写入请求,使其发生在第二个创建的事务的写入请求之后,以测试它是否将首先写入?setTimeout应该终止事务。可能是在请求之前放置了一个长期运行的同步循环。
这个问题最后的代码可以更准确地说明我试图问的问题。它以上面引用的文章中的MDN为例,将其扩展到一个文档中的两个承诺中
许诺一切都解决了
,两者都试图从
成功
事件
get
要求
问题是,在创建第二笔交易之前,第一笔交易的条款中的相同原则,无论请求的顺序如何,是否仍适用于此设置。由于承诺的同步部分将按照承诺在数组中的放置顺序进行处理,因此事务将在承诺中进行
p_1
将在
p_2
.然而
put
请求
成功
事件
收到
请进
p_1
由于循环生成一个大字符串而延迟。问题是威尔
p_1
还写过吗
p_2
?
在这个实验中,我无法得到
p_2
写之前
p_1
因此,MDN示例似乎适用于这种类型的设置。然而,我不能确定为什么,因为我不明白JS代码是如何真正解释/处理的。
例如,为什么
req.onsuccess
在发出请求后,是否要定义功能?我问的
question
前一段时间,但仍然不知道这是否会影响我尝试在这里添加延迟的方式。我知道它不会反过来工作;但我的观点是,我不确定浏览器在发出put请求之前是如何处理同步循环的
p_1
要真正确定这个示例演示了MDN文章在这个设置中始终有效。然而,我可以观察到,随着循环迭代次数的增加,完成请求需要更长的时间;而且,在我观察到的所有情况下,
p_1
以前总是写
p_2
.唯一的办法
p_2
以前写过
p_1
如果
p_1
根本不写,因为字符串占用了大量内存,导致事务在
p_1
被中止。
话虽如此,回到我的问题的更完整的设置,关于一系列的承诺中的三个承诺
许诺一切都解决了
与要求相比
输入保存
在开始工作前完成
许诺一切都解决了
关于剩下的两个承诺,在我项目的完整代码中,由于我不确定的原因,后者比前者更快,也就是等待
输入保存
完成比将其包含在列表中更快
许诺一切都解决了
.
我本来以为会是另一种情况。我现在能想到的唯一原因是
输入保存
和
拯救国家
都在写入同一个对象存储区,可能无论浏览器做什么,都相当于在第一个事务之前锁定对象存储区,这就是
输入保存
,完成,移除锁所需的时间比需要的时间长
输入保存
在考试前完成
许诺一切都解决了
开始,但不涉及锁。我以为一切都会“提前”准备好,就等着这两个人
放
请求按交易顺序进行。它们按顺序进行,但比使用更慢或至少不如使用:
输入保存()。然后(()=>{Promise.allSettled([save_state(),get_HTML()])。然后(…);
而不是:
Promise.allSettled( [ entry_save(), save_state(), get_HTML() ] ).then( ... );
function p_all() { Promise.allSettled( [ p_1(), p_2() ] ); }
function p_1()
{
return new Promise( ( resolve, reject ) =>
{
let T = DB.transaction( [ 'os_1', 'os_2' ], 'readwrite' ),
q = T.objectStore( 'os_1' ),
u = T.objectStore( 'os_2' ),
req, i, t ='', x = '';
req = q.get( 1 );
req.onsuccess = () =>
{
let i, t, r = req.result;
for ( i = 1; i < 10000000; i++ ) t = t + 'This is a string';
r.n = 'p1';
u.put( r );
console.log( r );
};
}); }
function p_2()
{
return new Promise( ( resolve, reject ) =>
{
let T = DB.transaction( [ 'os_1', 'os_2' ], 'readwrite' ),
q = T.objectStore( 'os_1' ),
u = T.objectStore( 'os_2' ),
req;
req = q.get( 1 );
req.onsuccess = () =>
{
let r = req.result;
r.n = 'p2';
u.put( r );
console.log( r );
};
}); }