【发布时间】:2019-01-23 11:38:54
【问题描述】:
我有一个传奇,假设是查询第三方工具来收集 UI 的状态。由于调用数量众多,以及我必须如何构建调用树,我正在尝试使用一种方法来使用 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 都是阻塞的。具体来说,我可以在我的网络选项卡中观看,因为只有在最后一次调用完成后才进行一次调用,并且我使用了 print 语句和 sleep 来确认在 doManualGetRequest 返回的 promise 完成执行之前不会调用新的 fork。
如果我不在 asyncQuery 中产生 fork 命令,而是在运行 join 命令之前在 joinRequest 中产生一个yield,我会看到所有查询都以适当的异步方式同时发出。
为什么 doManualGetRequest 中的让步会导致阻塞行为?
【问题讨论】:
标签: javascript asynchronous generator redux-saga