[请您告诉我此代码段末尾列出的结果是否意味着承诺p5()
和f5()
正在同时处理?
在我的项目代码中,sync()
生成并返回一个文档片段来替换DOM中的节点,但不替换它,并且p5()
是indexedDB数据库的读写操作。除非数据库操作成功,否则我不想用新片段替换现有节点,并且我想根据p5()
或f5()
可能失败的原因提供用户选项。
[我想知道是否将同步函数sync()
放置在一个Promise中,以便可以将其放置在Promise.allSettled
中,这将允许这两个进程同时运行,然后在两者都解决后检查错误,而不是等待[ C0]完成,然后再开始在p5()
中构建片段。
我对并发性知之甚少,但是这些结果似乎表明sync()
或sync()
花费了两秒钟的时间才能完成,并在f5()
之前的三秒内完成了所有操作,所有这些花费了5秒,而不是总共花费了7秒。
谢谢。
p5()
因为首先调用了实际的异步操作function p5() {
return new Promise( (resolve, reject) => {
setTimeout( () => resolve( 'p5 resolved at : ' + new Date()), 5000 ); }); }
function f5() {
return new Promise( (resolve, reject) => {
try { resolve( sync() ); }
catch(e) { reject( e ) }
}); }
function sync() {
let i, str ='';
for( i=0; i < 50000000; i++ ) str = str + 'A string of text';
i = str = null;
return 'sync complete at : ' + new Date();
}
console.log( 'start : ' + new Date() );
Promise.allSettled( [ p5(), f5() ] ).then( (r) => { console.log(r[0]); console.log(r[1]); } );
/* Results:
start : Sat Feb 22 2020 00:36:53 GMT-0500 (Eastern Standard Time)
r[0]:
{ "status": "fulfilled",
"value": "p5 resolved at : Sat Feb 22 2020 00:36:58 GMT-0500 (Eastern Standard Time)" }
r[1]:
{ "status": "fulfilled",
"value": "sync complete at : Sat Feb 22 2020 00:36:55 GMT-0500 (Eastern Standard Time)" }
*/
,所以它将在同步操作p5()
运行时启动并在后台运行。
异步f5()
在完成同步代码之前无法处理其完成,因为主JS线程一次只能执行一件事,并且同步代码阻塞了事件循环,因此任何异步操作都无法完成事件直到完成同步p5()
为止。
如果您像这样切换代码以对f5()
和p5()
重新排序:
f5()
然后,将不会有并发,因为在完成 Promise.allSettled( [ f5(), p5() ] ).then(...)
之前,p5()
甚至都不会开始使用。
我想知道是否将同步函数
f5()
放到一个Promise中,以便可以将其放置在Promise.allSettled中,这将允许这两个进程同时运行,然后在双方都解决后检查错误,而不是等待p5 ()完成,然后再开始在sync()
中构建片段。
FYI,将调用包装到Promise中的sync()
没有真正的优势。您也可以这样做:
sync()
这将使您获得相同的总体执行时间,因为p5().then(...);
f5();
仍将首先启动并在后台运行,并且直到阻塞p5()
完成后,才能再次处理其完成事件。