2017-12-01 10 views
0

이 질문을받는 사람은 누구나 알고 있습니다. 저는 redux에 익숙하지 않고 각도 및 서비스 논리에서 비롯되어 있으므로 redux가 작동하는 방식을 알고 있습니다. 나는 서사시 리스너 2 개 (서비스에서 GET 메소드를 호출하고 POST에서는 하나를 호출하는 것) + 서비스 (API에서 데이터를 가져 오는 데 사용) 만 사용하고 있습니다. 그래서 내가 API를 호출 할 때마다 url, param을 포함하는 일부 api 설정을 가진 객체를 만들고 api에 권한 헤더를 포함 시키면 한 번에 하나의 액션을 파견 할 때이 객체가 제대로 작동합니다. 여러 액션을 수행한다는 것은 여러 서비스를 제공하고 서사시 작업을 한 후에 여러 번 가져 오거나 게시하는 것을 의미하며 데이터를 저장하기 위해 감속원에게 가지 않고 오류를줍니다. Actions must be plain objects. Use custom middleware for async actions 내 구현에 문제가 있음을 알고 있습니다. 이런 식으로 작동한다면 나는 위대 할 것이다. 나는 썽크 같은 다른 서비스로 옮겨야한다. 데이터가 서사시에서 감속기로 이동하지 않는 경우

` 
GetEpic = (action$) => 
      action$.ofType(Action.Get) 
       .switchMap(({ payload }) => { 
        let { api, param, reqHeader, waitFor } = payload; 
        delete payload.api; 
        delete payload.param; 
        delete payload.reqHeader; 
        return HttpService.post(api, param, reqHeader, payload).then((userInfo) => { 
         if (userInfo.status && userInfo.status != 200) { 
          return { 
           type: 'ERROR' 
          } 
         } 
         return this.translateDataAndReturnType(userInfo, api, 'get', waitFor); 
        }).catch(() => { 
         return { 
          type: 'ERROR' 
         } 
        }) 
       }) 

translateDataAndReturnType(data, api, method, waitFor) { 
     if (data && api) { 
      this.count += 1; 
      let actionInfo = this.routesData.find((d, i) => { 
       return d.route == api 
      }) 
      let routeAction = Object.assign({}, actionInfo); 
      routeAction.payload = data; 
      this.localDate[routeAction.route] = data; 
      delete routeAction.route; 
      if (typeof waitFor == 'number') { 
       this.waitFor = waitFor; 
       this.count = 0; 
       this.count += 1; 
      } 
      if (this.count == this.waitFor) { 
       routeAction.payload = this.localDate; 
       if (this.actions) { 
        routeAction.type = this.actions; 
       } 
       return routeAction; 
      } 
     } 
    } 
` 

는 대답으로 업데이트
무엇 나는 여러 API를 사용하여 하나의 행동을 이용할 수 있도록 전략을 변경 때문에 가능하지 않은 한 번에 내 구성 요소에서 여러 액션 샷의 응답을 얻기 위해 노력하고 잘못하고 있었다 내가 경로와 JSON을 생성 내가

같은 일부 구성 작업을 호출하는 작업을 호출 할 때마다 너무

`this.routeConfig = { 
    "countriesCitesTimezone": [ 
       { route: 'countries', type: 'SUCCESS-COUNTRIES', param: '', reqHeader: false }, 
       { route: 'cities', param: '', reqHeader: false }, 
       { route: 'timezone', param: '', reqHeader: false } 
      ] 
}` 

을 API를하는 것이 다음

`GetEpic = (action$) => 
      action$.ofType(Action.Get) 
       .switchMap(({ payload }) => { 
        let requests = this.routesConfig[payload.route]; 
        return Observable.forkJoin(
        requests.map((d, ind) => { 
         let param = d.param; 
         if (payload.params.length > 0) { 
          param = payload.params[ind]; 
         } 
         return (HttpService.get(d.route, param, d.reqHeader)); 
        }) 
       ).map((x) => { 
        console.log(x); 
        let result = {}; 
        requests.map((d, ind) => { 
         result[d.route] = x[ind] 
        }) 
        return ({ 
         type: requests[0].type, 
         payload: result 
        }) 
       }) 
       })` 
+0

코드를 입력하십시오. –

+0

코드를 추가했는데'Action.Get'을'HttpService'에 대한 여러 설정으로 여러 번 호출하면'평범해야합니다 ... '라는 오류 메시지가 나타납니다. –

답변

0

서사시 ​​

에 의해 처리됩니다

나는 당신을 위해 무엇을 찾고있는 것은 mergeMap 대신 switchMap 생각합니다.

switchMap 것이다

프로젝트 가장 최근에 관찰 가능한 투사 된 값으로부터 발광 관찰 가능한 출력에 병합 된 관측 가능한 각 소스 값. switchMap()를 사용할 때 여전히 보류중인 경우

그래서, 입력 Action.Get의 모든 새로운 조치는 이전의 서비스 호출의 응답의 방출을 방지 할 수 있습니다.

또한 서비스 호출이 Promise을 반환한다고 가정하면 Observable.fromPromise()HttpService.post() 전화를 겁니다. Actions must be plain objects... 오류가 발생하는 이유는 사용자가 Promise을 내보내고 있기 때문입니다.이 메시지는 저장소로 발송됩니다.