本文的目的是介绍使用ES6的Promise.all()时限制并发的最佳方法是什么?的详细情况,特别关注在es6中,promise的状态有的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您
本文的目的是介绍使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?的详细情况,特别关注在es6中,promise的状态有的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?的机会,同时也不会遗漏关于android – 保存ArrayList内容的最佳方法是什么?、c# – 使用Rx执行延迟采样的最佳方法是什么?、c# – 清空目录的最佳方法是什么?、c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?的知识。
本文目录一览:- 使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?(在es6中,promise的状态有)
- android – 保存ArrayList内容的最佳方法是什么?
- c# – 使用Rx执行延迟采样的最佳方法是什么?
- c# – 清空目录的最佳方法是什么?
- c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?
使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?(在es6中,promise的状态有)
我有一些代码正在遍历从数据库中查询出来的列表,并为该列表中的每个元素发出 HTTP
请求。该列表有时可能是相当大的数字(以数千计),我想确保我不会访问具有数千个并发 HTTP 请求的 Web 服务器。
此代码的缩写版本目前看起来像这样......
function getCounts() { return users.map(user => { return new Promise(resolve => { remoteServer.getCount(user) // makes an HTTP request .then(() => { /* snip */ resolve(); }); }); });}Promise.all(getCounts()).then(() => { /* snip */});
此代码在节点 4.3.2 上运行。重申一下,可以Promise.all
进行管理,以便在任何给定时间只有一定数量的 Promise 正在进行?
答案1
小编典典请注意,Promise.all()
它不会触发 Promise 开始工作,而是创建 Promise 本身。
考虑到这一点,一种解决方案是在解决承诺时检查是否应该开始新的承诺,或者您是否已经达到极限。
但是,这里真的没有必要重新发明轮子。您可以用于此目的的一个库是es6-promise-pool
. 从他们的例子中:
var PromisePool = require(''es6-promise-pool'')var promiseProducer = function () { // Your code goes here. // If there is work left to be done, return the next work item as a promise. // Otherwise, return null to indicate that all promises have been created. // Scroll down for an example. }// The number of promises to process simultaneously. var concurrency = 3// Create a pool. var pool = new PromisePool(promiseProducer, concurrency)// Start the pool. var poolPromise = pool.start()// Wait for the pool to settle. poolPromise.then(function () { console.log(''All promises fulfilled'')}, function (error) { console.log(''Some promise rejected: '' + error.message)})
android – 保存ArrayList内容的最佳方法是什么?
解决方法
不知道“东西”是什么,我们不能轻易回答这个问题.
您的一般选择是使用数据库(可能实际上首先摆脱了ArrayList)或持久化到文件(序列化,XML,JSON等).
一般来说,sqlite数据库具有优势,因为它使用事务并且通常比仅编写自己的文件更健壮.但是,您的ArrayList可能存储的内容在数据库中可能无法正常工作.当然,您的ArrayList可能存储的内容甚至可能根本不能保留(例如,套接字,小部件).
c# – 使用Rx执行延迟采样的最佳方法是什么?
我的目标是在重新建立连接时引入一点延迟,以允许网络适配器有时间连接到互联网(UWP的解决方法).如果在此延迟中出现任何值,则只需保留最后一个值,因为只有当前连接状态很重要.
这很好,但感觉有点hacky:
internal static class ConnectivityExtensions { public static IObservable<bool> ToObservable(this IConnectivity @this) { var connectivity = Observable .FromEventPattern<ConnectivityChangedEventHandler,ConnectivityChangedEventArgs>( handler => @this.ConnectivityChanged += handler,handler => @this.ConnectivityChanged -= handler) .Select(args => args.EventArgs.IsConnected); var sampling = connectivity .Timestamp() .Select(ts => new { ts.Value,ts.Timestamp,// If reconnection,delay subscriber notification for 250ms DelayUntil = ts.Value ? (DateTimeOffset?)ts.Timestamp.Add(TimeSpan.FromMilliseconds(250)) : null }) .Scan((acc,current) => new { current.Value,current.Timestamp,// If current notification is during reconnection notification delay period,delay the current notification too DelayUntil = current.Timestamp < acc.DelayUntil ? acc.DelayUntil : current.DelayUntil }) // Perform reconnection delay .Delay(x => x.DelayUntil.HasValue ? Observable.Return(x.DelayUntil.Value).Delay(x.DelayUntil.Value) : Observable.Empty<DateTimeOffset>()) // All delayed notifications are delayed until the same time,so we only need one notification to trigger sampling after delay .distinctUntilChanged() .Select(_ => Unit.Default); return connectivity .Sample(sampling) .StartWith(@this.IsConnected) .distinctUntilChanged() .Replay(1) .RefCount(); } }
示例输出:
通过这个例子,你可以看到我正在做的事情的好处.当“连接”改变时,延迟阻止订户处理数据,但是尚未建立互联网连接(UWP).此外,这还可以保护用户免受任何快速“开/关”通知.
// StartsWith: True ConnectivityChanged(null,new ConnectivityChangedEventArgs { IsConnected = true }); // Delay 250ms Thread.Sleep(TimeSpan.FromMilliseconds(250)); // Sample: True,Ignored due to distinctUntilChanged ConnectivityChanged(null,new ConnectivityChangedEventArgs { IsConnected = false }); // Sample: False Thread.Sleep(TimeSpan.FromMilliseconds(250)); ConnectivityChanged(null,new ConnectivityChangedEventArgs { IsConnected = true }); // Delay 250ms,discarded due to Sample ConnectivityChanged(null,new ConnectivityChangedEventArgs { IsConnected = false }); // Delayed by prevIoUs,new ConnectivityChangedEventArgs { IsConnected = true }); // Delayed by prevIoUs,new ConnectivityChangedEventArgs { IsConnected = false }); // Delayed by prevIoUs Thread.Sleep(TimeSpan.FromMilliseconds(250)); // Sample: False,Ignored due to distinctUntilChanged // Final Output: // True // False
有没有更优化的方法来实现这种类型的延迟采样?
解决方法
T (millis) : 0----250--500--1000-1250-1500-1750-2000 Connectivity : ---F-------T---F----T-------F--T------- ScanValueDelayUntil : ---null----800-null-1500----null2100--- Sampling : -------------x-----------x-----------x- ResultSampled : T------------T-----------T-----------T- ResultSampleddistinct: T--------------------------------------
这似乎没有多大意义.你能描述一下你希望结果代表什么,或者纠正我错在哪里?
c# – 清空目录的最佳方法是什么?
非优雅的解决方案:
public static void EmptyDirectory(string path) { if (Directory.Exists(path)) { // Delete all files foreach (var file in Directory.GetFiles(path)) { File.Delete(file); } // Delete all folders foreach (var directory in Directory.GetDirectories(path)) { Directory.Delete(directory,true); } } }
解决方法
在任何情况下,您(或您使用的某些方法)必须遍历所有文件和子目录.但是,您可以使用GetFileSystemInfos同时迭代文件和目录:
foreach(System.IO.FileSystemInfo fsi in new System.IO.DirectoryInfo(path).GetFileSystemInfos()) { if (fsi is System.IO.DirectoryInfo) ((System.IO.DirectoryInfo)fsi).Delete(true); else fsi.Delete(); }
c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?
我只是想知道实现像Facebook Wall这样的线程对话的最佳方法是在其中将评论显示在每个帖子下,而较旧的评论则可以折叠和展开.我的本能是使用嵌套的数据列表,但是我认为这可能会降低性能.
关于使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?和在es6中,promise的状态有的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – 保存ArrayList内容的最佳方法是什么?、c# – 使用Rx执行延迟采样的最佳方法是什么?、c# – 清空目录的最佳方法是什么?、c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?等相关内容,可以在本站寻找。
本文标签: