我在用
redux-saga
同时启动多个请求,如中所述
the redux-saga docs
. 这个
all
效果有
all or nothing semantics
,类似于
Promise.all
.
只有全部
effects
成功,
yield all([...])
成功。然而,我正在做一些请求,我希望其中一些失败,一些成功。我想并行启动所有这些请求,并使用那些成功请求的响应。
因此,我试图将请求包装成
Promise
无论请求是否成功,都始终解决:
// watcher saga
export function* watchMultipleRequests() {
while(true) {
const {ids} = yield take('VIDEOS_REQUEST');
yield fork(doMultipleRequests, ids);
}
}
// worker saga
export function* doMultipleRequests(ids) {
const requests = ids.map(id => {
// api.buildVideoRequest returns a promise once it is invoked
const wrapper = ignoreErrors(api.buildVideoRequest, id);
return call(wrapper);
});
try {
const responses = yield all(requests);
yield put({type: 'VIDEOS_SUCCESS', responses});
} catch (error) {
// should not happen because we are always resolving the promise
console.log(error);
}
};
export function ignoreErrors(fn, ...args) {
return function* () {
yield new Promise(function (resolve) {
return fn(...args)
.then(response => {
console.log('success = ', response);
resolve(response);
})
.catch(response => {
console.log('error = ', response);
resolve(response);
});
});
}
}
我想处理
reducer
. 但是,如果我开枪
n
请求
responses
数组包含
n个
时代
undefined
. 有人知道为什么这不起作用吗?