代码之家  ›  专栏  ›  技术社区  ›  dsollen

为什么我的叉子会挡住我,如果我马上放弃它?

  •  0
  • dsollen  · 技术社区  · 7 年前

    我有一个传说,它假设要查询第三方工具来收集用户界面的状态。由于大量的调用,以及如何构建调用树,我尝试使用一个以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;
    }
    

    经过一些实验,我发现对doManualGetRequest的每个调用都被阻塞了。具体来说,我可以在networking选项卡中看到,只有在最后一次调用完成后才进行一次调用,我使用print语句和sleep来确认在doManualGetRequest返回的promise完成执行之前不会调用新fork。

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

    为什么在domanualgestrequest中屈服会导致阻塞行为?

    1 回复  |  直到 7 年前
        1
  •  1
  •   tpdietz    7 年前

    yield 荷兰国际集团 fork doManualGetRequest 阻塞是因为 域代数探索 这里的文档有点棘手,如果你仔细看,你可以找出原因。

    从文档中:

    所有分叉的任务都附属于父母。当父进程终止执行它自己的指令体时,

    https://redux-saga.js.org/docs/api/#forkfn-args

    所以如果你有更多的代码 域代数探索 之后 yield fork 域代数探索 不会的 返回 完成(或失败)。

    这样您就可以将引用附加到异步任务,并可能取消该任务或检查其是否仍在运行。你的情况下,你不需要那个功能。 spawn 相反。

    从医生那里, 生成(fn,…args)

    与fork(fn,…args)相同,但创建分离的任务。分离的任务与其父任务保持独立,其行为类似于顶级任务。 父级不会等待分离的任务终止,然后返回

    https://redux-saga.js.org/docs/api/#spawnfn-args