2017-12-17 25 views
0

일부 경주 용 꿀벌이 있습니다. 내 redux 저장소에서는 name 속성과 likelihood 속성이있는 배열의 개체입니다. 각 벌에 대해서, 나는 그 우승 확률을 계산하고 싶습니다. 계산 알고리즘은 비동기입니다. 모든 꿀벌의 계산을 시작할 때 꿀벌의 우도 속성은 '계산'값을 가져야하며, 꿀벌 계산이 완료되면 우도 속성은 숫자를 표시해야합니다.Redux 저장소의 항목에 대해 별도의 비동기 호출 처리

수정 할 수없는 기능이 generateBeeWinLikelihoodCalculator입니다.

지금 당장은 꿀벌을 따로 뽑을 확률을 계산하지 않아이를 달성하는 최선의 방법을 찾지 못했습니다. 각 꿀벌 인스턴스에 calcultingLikelihood 함수를 보내고 감속기에서 호출하는 방법을 생각해 보았습니다. 그렇다면 먼저 '계산 중 ...'을 반환하고 setTimeout이 실행되면 값을 반환해야합니다.

let state = {bees:[{name: 'marie'},{name: 'john'}]} 
 

 
const reducer = (state, action) => { 
 
\t switch (action.type) { 
 
    \t case 'FETCH_BEES': 
 
    \t return { 
 
     \t ...state, 
 
     bees: action.bees, 
 
     } 
 
    case 'RUN_CALCULATIONS': 
 
    \t return { 
 
     \t ...state, 
 
     bees: state.bees.map(bee => { 
 
     \t bee.likelihood = action.likelihood 
 
      return bee 
 
     }) 
 
     } 
 
    case 'DISPLAY_CALCULATIONS': 
 
     \t return { 
 
     \t ...state, 
 
     bees: state.bees.map(bee => { 
 
     \t bee.likelihood = action.likelihood 
 
      return bee 
 
     }) 
 
     } 
 
    default: return state 
 
    } 
 
} 
 

 
const runCalculations = (likelihood) => ({ 
 
\t type: 'RUN_CALCULATIONS', 
 
    likelihood, 
 
}) 
 

 
const displayCalculations = (likelihood) => ({ 
 
\t type: 'DISPLAY_CALCULATIONS', 
 
    likelihood, 
 
}) 
 

 
const store = { 
 
\t dispatch: (action) => { 
 
    \t state = reducer(state,action) 
 
    \t return state 
 
    }, 
 
    getState:() => { 
 
    \t return state 
 
    } 
 
} 
 

 
//this calculator cannot be modified 
 
const generateBeeWinLikelihoodCalculator =() => { 
 
    var delay = 1000 + Math.random() * 1000; 
 
    var likelihoodOfAntWinning = Math.random(); 
 

 
    return function(callback) { 
 
    setTimeout(function() { 
 
     callback(likelihoodOfAntWinning) 
 
    }, delay); 
 
    }; 
 
} 
 

 
const calculatingLikelihood =() => { 
 
    store.dispatch(runCalculations('calculating...')) 
 
    console.log(JSON.stringify(store.getState())) 
 
\t const callback = (likelihoodOfBeeWinning) => { 
 
    \t store.dispatch(displayCalculations(likelihoodOfBeeWinning)) 
 
    \t console.log(JSON.stringify(store.getState())) 
 
    } 
 
    return generateBeeWinLikelihoodCalculator()(callback) 
 
} 
 

 
calculatingLikelihood()

+0

내가 틀렸다면 나를 바로 잡습니다 : 당신은 물건의 목록을 가지고 있습니다. 각각의 개별 객체 (꿀벌)을 사용하면 작업이 해결되면 비동기 작업을 수행하고 해당 객체를 상태로 업데이트해야합니다. 상태를 업데이트하기 전에 해결할 모든 작업 약속을 기다리거나 해결 된 각 계산에 대해 상태를 개별적으로 업데이트 할 수 있습니다. – chautelly

+0

해결 된 각 계산의 상태를 업데이트해야하지만 현재 계산을 개별적으로 수행하는 방법에 대한 손실이 있습니다. ... –

답변

1

은 나뿐만 아니라 꿀벌에게 ID 속성을주고 꿀벌의 배열 대 ID로 꿀벌의지도로 저장할 것입니다. 이렇게하면 상태에있는 개별 꿀벌을 쉽게 업데이트 할 수 있습니다.

약속이나 비동기/대기를 사용할 수도 있습니다.

그래서 상태가된다 :

하는 상태 = {꿀벌을 보자 : {1 : {ID : 1, 이름 : '마리'}, 2 : {ID : 2 명 : '존'}}

// Grab the list of Bees 
const bees = store.getState().bees 

// Work on each bee and update it individually 
Object.values(bees).forEach(async bee => { 
    const likelihood = await calculate(bee) 
    store.dispatch({ type: 'UPDATE_BEE', payload: { ...bee, likelihood } }) 
}) 

// Or you could wait for all calculations to resolve before updating state 
const promises = Object.values(bees).map(async bee => { 
    const likelihood = await calculate(bee) 
    return { ...bee, likelihood } 
}) 

Promise.all(promises).then(bees => { 
    store.dispatch({ type: 'UPDATE_BEES', payload: _.keyBy(bees, 'id') }) 
}) 
+0

불행히도 각 그림이 해결 될 때 가능성 그림을 보여줄 필요가 있습니다. 나는 다음 꿀벌을위한 행동을 파견하기 전에 첫 번째 꿀벌이 해결 될 때까지 기다릴 수 없다. 동시에 실행해야하며 벌 3에 대한 계산이 먼저 해결되면 먼저 표시됩니다. –

+0

정확히 forEach 루프에서 수행하는 작업입니다. 'forEach'에 전달 된 함수는 비동기 함수입니다. 반복은 계산 약속이 다음 문제로 넘어 가기 전에 해결 될 때까지 기다리지 않습니다. – chautelly