是同时运行一个同步进程和一个异步进程的组合吗?

问题描述 投票:1回答:1

[请您告诉我此代码段末​​尾列出的结果是否意味着承诺p5()f5()正在同时处理?

在我的项目代码中,sync()生成并返回一个文档片段来替换DOM中的节点,但不替换它,并且p5()是indexedDB数据库的读写操作。除非数据库操作成功,否则我不想用新片段替换现有节点,并且我想根据p5()f5()可能失败的原因提供用户选项。

[我想知道是否将同步函数sync()放置在一个Promise中,以便可以将其放置在Promise.allSettled中,这将允许这两个进程同时运行,然后在两者都解决后检查错误,而不是等待[ C0]完成,然后再开始在p5()中构建片段。

我对并发性知之甚少,但是这些结果似乎表明sync()sync()花费了两秒钟的时间才能完成,并在f5()之前的三秒内完成了所有操作,所有这些花费了5秒,而不是总共花费了7秒。

谢谢。

p5()
javascript concurrency promise
1个回答
1
投票

因为首先调用了实际的异步操作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()完成后,才能再次处理其完成事件。

© www.soinside.com 2019 - 2024. All rights reserved.