Javascript 如果我马上把叉子放下,为什么我的叉子会卡住?

Javascript 如果我马上把叉子放下,为什么我的叉子会卡住?,javascript,asynchronous,generator,redux-saga,Javascript,Asynchronous,Generator,Redux Saga,我有一个传说,它假设查询第三方工具来收集UI的状态。由于调用的数量非常多,而且我必须构建调用树,因此我尝试使用fork启动请求的方法,允许我在拼凑所需调用时并行生成十几个请求,并使用第二个方法连接fork调用并收集结果 我的查询方法(应该启动调用)如下所示: * asyncQuery(action, domain, config) { let baseUrl; if (config && domain) { baseUrl = getBaseUrl(co

我有一个传说,它假设查询第三方工具来收集UI的状态。由于调用的数量非常多,而且我必须构建调用树,因此我尝试使用fork启动请求的方法,允许我在拼凑所需调用时并行生成十几个请求,并使用第二个方法连接fork调用并收集结果

我的查询方法(应该启动调用)如下所示:

* asyncQuery(action, domain, config) {
   let baseUrl;

   if (config && domain) {
      baseUrl = getBaseUrl(config.deployments, domain);
   }  else {
      baseUrl = yield select(selectUrlForDomain(domain));
   }

   return yield fork(this.doManualGetRequest, action.payload.apiPath, baseUrl);
}


 doManualGetRequest(apiPath, baseUrl) {

     const url = buildUrl(basUrl, apiPath);

     const requestPromise = fetch(url, options)
         .then(checkStatus)
         .then(parseJSON)
         .then((data) => ({ data }))
         .catch((err) => ({ err }));
}
这是由一些逻辑调用的,这些逻辑负责建立请求树,并将每个调用添加到队列中。调用joinRequets之前:

* joinRequests(requestsMap) {
    const results = {}
    const requests = Object.entries(requestsMap)


    join(Object.values(requestsMap));

    for (let i = 0; i < requests.length; i++) {

       const [key, request] = request[i];

       results[key] = request.result();
    }

    return results;
}
*联合请求(requestsMap){
常量结果={}
const requests=Object.entries(requestsMap)
join(Object.values(requestsMap));
for(设i=0;i
经过一些实验,我发现对DomainAlgeTrequest的每次调用都被阻塞了。具体地说,我可以在我的“网络”选项卡中观察,因为只有在最后一次调用完成后才进行一次调用,并且我使用打印语句和睡眠来确认在doManualGetRequest返回的承诺完成执行之前不会调用新的fork

如果我没有在asyncQuery中生成fork命令,而是在运行join命令之前在joinRequest中生成一个yield命令,那么我会看到所有查询都以正确的异步方式一次发送出去


为什么在doManualGetRequest中让步会导致阻塞行为?

让步
doManualGetRequest中使用
分叉
阻塞,因为
doManualGetRequest
在返回之前等待分叉过程。这里的文档有点棘手,如果仔细查看,您可以找到原因

从文档中:

所有分叉任务都附加到它们的父任务。当父级终止其自身指令体的执行时,将等待所有分叉任务终止后再返回。

因此,如果在
yield fork
之后的
doManualGetRequest
中有更多的代码,那么该代码将在您分叉进程后立即运行。但是,
doManualGetRequest
将不会返回,直到
fork
完成(或失败)

fork
的目的是让您可以附加对异步任务的引用,并可能取消它或检查它是否仍在运行。就你的情况而言,你不需要那种功能请尝试
spawn

从文档中,生成(fn,…args)

与fork(fn,…args)相同,但创建分离的任务。分离的任务保持独立于其父任务,其行为类似于顶级任务父任务在返回之前不会等待分离任务终止,所有可能影响父任务或分离任务的事件都是完全独立的(错误、取消)


使用spawn似乎有完全相同的问题,它仍然阻止我的函数返回,不管文档怎么说