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