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

如何在《红人传奇》中运用全效应对错误

  •  0
  • productioncoder  · 技术社区  · 6 年前

    我在用 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 . 有人知道为什么这不起作用吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   productioncoder    6 年前

    问题是ignorerros函数是一个生成器函数。 像这样执行:

    export function ignoreErrors(fn, ...args) {
      return () => {
        const ignoreErrorCallback = (response) => response;
        return fn(...args).then(ignoreErrorCallback, ignoreErrorCallback);
      };
    }
    

    已经足够了。