在下面的代码中,
Promise.allSettled( [ entry_save(), save_state(), get_HTML() ] ).then( ... );
承诺entry_save
和save_state
都是readwrite
数据库事务,get_HTML
是readonly
。这两个readwrite
事务可以合并在一起,但这会使维护的撤消/重做链变得复杂,并且将两个事务的成功和回滚联系在一起,这是不希望的。
entry_save
事务需要在save_state
事务之前写入。在将entry_save
移到Promise.allSettled
之前,它是这样工作的,因为entry_save
事务是在其他事务之前创建的。 MDN article解释了如何执行请求的顺序基于何时创建事务而与发出请求的顺序无关。
我的问题是,每个promise过程的同步代码是否都按照在数组中的放置顺序进行排序,因此,首先放置entry_save
将始终导致首先创建其事务,并保证将首先执行其数据库请求?
尽管它可以运行并且足够快,但我不希望这样做:
entry_save().then( () => { Promise.allSettled( [ save_state(), get_HTML() ] ) } ).then( ... );
如果很重要,那不完全是它的编写方式,它更符合:
entry_save().then( intermediate );
,其中intermediate
调用Promise.allSettled
。谢谢。
执行此操作时:
Promise.allSettled( [ entry_save(), save_state(), get_HTML() ] ).then(...)
等效于此:
const p1 = entry_save();
const p2 = save_state();
const p3 = get_HTML();
Promise.allSettled([p1, p2, p3]).then(...);
因此,您发出的单个功能调用,例如save_state()
,将按照指定的顺序启动。但是,每个调用都是异步的,因此这些操作是按顺序启动的,但实际上取决于它们在内部执行的操作,这些操作决定了这些功能的每个单独部分的排序方式,因为它们可以同时运行并且在运行中它们的执行可以不确定的顺序交错。
想象一下,entry_save()
实际上由多个异步部分组成,例如首先从磁盘读取一些数据,然后对其进行修改,然后调用数据库。它会调用第一个异步段,然后立即返回一个Promise。然后,save_state()
将开始执行。如果save_state()
刚刚立即发出对数据库的写操作,那么它很可能在entry_save()
写入数据库之前写到数据库。实际上,两次数据库写入的顺序是不确定的。
如果您需要在entry_save()
之前完成save_state()
,则以上根本不是编码它的方法。您的代码不保证entry_save()
的所有操作都在运行save_state()
之前完成。
相反,您应该做您似乎已经知道的事情:
entry_save().then( () => { Promise.allSettled( [ save_state(), get_HTML() ] ) } ).then( ... );
仅保证entry_save()
将在save_state()
运行之前完成。并且,这假设您完全可以同时运行save_state()
和get_HTML()
并且以不可预测的顺序运行。