GVKun编程网logo

使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?(在es6中,promise的状态有)

17

本文的目的是介绍使用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的状态有)

使用 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内容的最佳方法是什么?

android – 保存ArrayList内容的最佳方法是什么?

我想保存一个ArrayList,以便它是持久的.内容可以改变.在 android中接近这个的最佳方法是什么?

解决方法

你的问题类似于问“我有这个东西 – 我应该将东西转移到盒子,桶,桶或箱子里吗?”.

不知道“东西”是什么,我们不能轻易回答这个问题.

您的一般选择是使用数据库(可能实际上首先摆脱了ArrayList)或持久化到文件(序列化,XML,JSON等).

一般来说,sqlite数据库具有优势,因为它使用事务并且通常比仅编写自己的文件更健壮.但是,您的ArrayList可能存储的内容在数据库中可能无法正常工作.当然,您的ArrayList可能存储的内容甚至可能根本不能保留(例如,套接字,小部件).

c# – 使用Rx执行延迟采样的最佳方法是什么?

c# – 使用Rx执行延迟采样的最佳方法是什么?

我正在开发一个Xamarin应用程序,我已经扩展了 Connectivity插件以使用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# – 清空目录的最佳方法是什么?

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);
        }
    }
}

解决方法

System.IO.Directory.Delete怎么样?它有一个递归选项,你甚至使用它.检查你的代码看起来你正试图做一些稍微不同的事情 – 清空目录而不删除它,对吧?好吧,你可以删除它并重新创建它:)

在任何情况下,您(或您使用的某些方法)必须遍历所有文件和子目录.但是,您可以使用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)的最佳方法是什么?

c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?

我只是想知道实现像Facebook Wall这样的线程对话的最佳方法是在其中将评论显示在每个帖子下,而较旧的评论则可以折叠和展开.我的本能是使用嵌套的数据列表,但是我认为这可能会降低性能.

最佳答案
我会考虑使用ASP .NET MVC而不是webforms.我将使用初始页面加载来加载服务器端的前几个帖子,然后考虑使用带有jQuery的AJAX来实现客户端解决方案以检索其他记录-这里有一个example of that here.

关于使用 ES6 的 Promise.all() 时限制并发的最佳方法是什么?在es6中,promise的状态有的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – 保存ArrayList内容的最佳方法是什么?、c# – 使用Rx执行延迟采样的最佳方法是什么?、c# – 清空目录的最佳方法是什么?、c#-在.NET中实现线程对话(如Facebook Wall)的最佳方法是什么?等相关内容,可以在本站寻找。

本文标签: