Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.all已解决大量请求_Javascript_Reactjs_Express_Concurrency_Promise - Fatal编程技术网

Javascript Promise.all已解决大量请求

Javascript Promise.all已解决大量请求,javascript,reactjs,express,concurrency,promise,Javascript,Reactjs,Express,Concurrency,Promise,我有一个批量创建参与者功能,它使用Promise.allSettled发送100axiosPOST请求。后端是Express,前端是React。该请求是调用单个addnewparticipantrestapi。我使用connecttimeout将后端超时设置为15秒。前端是10秒超时 我的问题是,当我单击批量添加按钮时,会触发批量创建,并且Promise.allselled并发启动。但是,在所有并发请求完成之前,我无法发送新请求。因为我在前端设置了超时,新请求将被取消 有没有办法,我仍然可以发出

我有一个批量创建参与者功能,它使用
Promise.allSettled
发送100
axios
POST
请求。后端是
Express
,前端是
React
。该请求是调用单个
addnewparticipant
restapi。我使用
connecttimeout
将后端超时设置为15秒。前端是10秒超时

我的问题是,当我单击批量添加按钮时,会触发批量创建,并且
Promise.allselled
并发启动。但是,在所有并发请求完成之前,我无法发送新请求。因为我在前端设置了超时,新请求将被取消

有没有办法,我仍然可以发出并发请求,但该请求不会停止其他新请求

这是前端代码,
createParticipant
是API请求

const PromiseArr = []
for (let i = 0; i < totalNumber; i++) {
    const participant = participantList[i]
    const participantNewDetail = {
        firstName: participant.firstName,
        lastName: participant.lastName,
        email: participant.email,
    }
    PromiseArr.push(
        createParticipant(participantNewDetail)
            .then((createParticipantResult) => {
                processedTask++
                processMessage = `Processing adding participant`
                dispatch({ type: ACTIVATE_PROCESS_PROCESSING, payload: { processedTask, processMessage } })
            })
            .catch((error) => {
                processedTask++
                processMessage = `Processing adding participant`
                dispatch({ type: ACTIVATE_PROCESS_PROCESSING, payload: { processedTask, processMessage } })
                throw new Error(
                    JSON.stringify({
                        status: "failed",
                        value: error.data.message ? error.data.message : error,
                    })
                )
            })
    )
}
const addParticipantResults = await Promise.allSettled(PromiseArr)
const PromiseArr=[]
for(设i=0;i{
处理任务++
processMessage=`Processing正在添加参与者`
分派({type:ACTIVATE_PROCESS_PROCESSING,payload:{processedTask,processMessage}})
})
.catch((错误)=>{
处理任务++
processMessage=`Processing正在添加参与者`
分派({type:ACTIVATE_PROCESS_PROCESSING,payload:{processedTask,processMessage}})
抛出新错误(
JSON.stringify({
状态:“失败”,
值:error.data.message?error.data.message:error,
})
)
})
)
}
const addParticipantResults=等待承诺。全部结算(PromiseArr)
PromiseArr
是长度为100的Promise数组

我是否可以将这个大请求拆分为小块promise数组并发送到后端,在每个请求间隔内,我是否可以发送另一个新请求,如
retrieveuserdetail


如果您一次向服务器发送100个请求,那么服务器需要一段时间来处理。最好是找到一种方法,将它们全部合并到一个请求或一个非常小的请求中。一些服务器API有在一个请求中执行多个查询的有效方法

如果您不能做到这一点,那么您可能应该一次最多发送5-10个请求,这样服务器就不会被要求同时处理太多的请求,这会导致您的额外请求到达队列的末尾,并且处理时间太长。这将允许你发送其他的东西,并让他们处理,而你正在分块的100,而不必等待所有的完成

如果这是从浏览器执行的,那么当浏览器拒绝一次向同一主机发送N个以上的请求时,您还需要处理一些浏览器保护限制。因此,如果您发送的内容超过这些内容,它会将它们排成队列并保留它们,直到之前的一些请求完成。这使得一个客户机不会对服务器造成巨大的压力,但也会产生一长串的请求,任何新的请求都必须排到最后。处理这种情况的方法是,永远不要向同一主机发送超过一小部分的请求,这样,当您想要发送新请求时,队列/线路就会变短

您可以查看这些代码片段,它们允许您一次处理一个数据数组,而不是一次处理所有数据。每一个都有稍微不同的控制选项,因此您可以决定哪一个最适合您的问题

-同时处理不超过N个请求的阵列

-与mapConcurrent类似,具有更多参数检查

-处理最大N个请求秒

-允许您在出现错误时继续处理


所有这些都将取代
Promise.all()
以及用于迭代数据、启动所有请求并将承诺收集到数组中的任何代码。这些函数接受一个数据输入数组,一个要调用的函数,该函数传递一个数据项,并应返回一个解析为该请求结果的承诺,它们返回一个解析为原始数组顺序的数据数组的承诺(返回值与
promise.all()
)。

感谢您的解释。我没有将它们合并到一个请求中的原因是,我有一个进度条,在完成时显示每个请求的状态。所以我需要把它们分开。我会查一查你提到的。