2017-10-14 2 views
0

그래서, 나는 base64로 이미지를 변환하는 함수가있다. 이 함수는 비동기식이며 Promise.all()을 사용하여 4 개의 이미지를 변환 한 다음받은 문자열로 객체를 반환합니다. 그래서 비동기 함수를 내 보냅니다. 여기에 코드입니다 : 다음비동기/대기중인 Redux

import IMAC from '../assets/Images/devices/mac_monitor.png'; 
import MACBOOK from '../assets/Images/devices/macbook_pro.png'; 
import IPHONE_8 from '../assets/Images/devices/iphone_8.png'; 
import MSI_LAPTOP from '../assets/Images/devices/msi_laptop.png'; 

function loadImage(img) { 
    return new Promise((resolve, reject) => { 
     toDataURL(img, function (dataUrl) { 
      resolve(dataUrl); 
     }) 
    }); 
} 

function toDataURL(url, callback) { 
    const xhr = new XMLHttpRequest(); 
    xhr.onload = function() { 
     let reader = new FileReader(); 
     reader.onloadend = function() { 
      callback(reader.result); 
     }; 
     reader.readAsDataURL(xhr.response); 
    }; 
    xhr.open('GET', url); 
    xhr.responseType = 'blob'; 
    xhr.send(); 
} 

const IMAC_IMG_BASE64 = loadImage(IMAC); 
const MACBOOK_IMG_BASE64 = loadImage(MACBOOK); 
const MSI_IMG_BASE64 = loadImage(MSI_LAPTOP); 
const PHONE_IMG_BASE64 = loadImage(IPHONE_8); 

export async function loadAllImages() { 
    const result = await Promise.all([IMAC_IMG_BASE64, MACBOOK_IMG_BASE64, MSI_IMG_BASE64, PHONE_IMG_BASE64]); 
    return [ 
     { 
      id: 0, 
      device: "Apple iMac", 
      image: result[0], 
      styles: { 
       carousel_item: { 
        width: "41.6vw", 
        height: "auto", 
        top: "-4.095vw", 
        left: "-0.13vw" 
       }, 
       carousel: { 
        height: "38vw", 
        margin: "50px 0" 
       }, 
       device: { 
        width: "46.5vw", 
        height: "38vw", 
        marginLeft: "-23.25vw" 
       } 
      } 
     }, 
     { 
      id: 1, 
      device: "Apple Macbook Pro", 
      image: result[1], 
      styles: { 
       carousel_item: { 
        width: "37vw", 
        height: "auto", 
        top: "-4.4vw", 
        left: ".6vw" 
       }, 
       carousel: { 
        height: "38vw", 
        margin: "50px 0" 
       }, 
       device: { 
        width: "55vw", 
        height: "30vw", 
        marginLeft: "-27.5vw" 
       } 
      } 
     }, 
     { 
      id: 2, 
      device: "MSI GP72VR 7RFX", 
      image: result[2], 
      styles: { 
       carousel_item: { 
        width: "35vw", 
        height: "auto", 
        top: "-5.8vw", 
        left: ".5vw" 
       }, 
       carousel: { 
        height: "38vw", 
        margin: "50px 0" 
       }, 
       device: { 
        width: "50vw", 
        height: "34vw", 
        marginLeft: "-25vw" 
       } 
      } 
     }, 
     { 
      id: 3, 
      device: "Iphone 8", 
      image: result[3], 
      styles: { 
       carousel_item: { 
        width: "14vw", 
        height: "auto", 
        top: "-8.2vw", 
        left: "0" 
       }, 
       carousel: { 
        height: "38vw", 
        margin: "50px 0" 
       }, 
       device: { 
        width: "17.7vw", 
        height: "34vw", 
        marginLeft: "-8.85vw" 
       } 
      } 
     }, 
    ]; 
} 

는, 내가이 기능 (loadAllImages())에서 수신 된 데이터를 비동기가있다이 작업 작성자을 가지고, 그리고 내가 파견에게 전화 (추신 - 내가 사용하고 redux- 또한)

export const loadConfigs =() => async dispatch => { 
const data = await loadAllImages(); 
dispatch({type: "LOAD_DATA", payload: data}); 
}; 

을 썽크, 내가, 내가 개체와 페이로드를 반환 할 경우, 감속기가 메인 컨테이너 App.js 내부 호출 파견

export default (sliderConfig = null, action) => { 
    const {type, payload} = action; 
    switch(type){ 
     case "LOAD_DATA": 
      return payload; 
    } 

    return sliderConfig; 
} 

로부터받은, 나는 콤포넌트 안에이 AC 전화 nentDidMount() 내가 비동기 AC로부터받은이 데이터를 사용하고 있습니다 어디 그럼 난, 구성 요소가,

componentDidMount() { 
     this.props.fetchUser(); 
     this.props.loadConfigs(); 
    } 

을 그리고 (이 상황에서 중요하지 않습니다 fetchUser() 보지 말라).

import React, {Component, PureComponent} from 'react'; 
import appDesign from '../../../decorators/scroll_resize_decorator'; 
import Slider from './Slider'; 
import {connect} from 'react-redux'; 
import * as actions from '../../../actions'; 

//Hint: Use container for the images in the slider 
//Because errors with movement is appeared 
class BlockFour extends Component { 

    render() { 

     if (this.props.sliderElements) { 
      const {sliderElements, width, config, selectConfig} = this.props; 
      return (
       <div className="blockfive"> 
        <div className="blockfive--inner"> 
         <div className="blockfive__container"> 
          <div className="blockfive__container__header"> 
           <div className="blockfive__container__header__container"> 
            <h1>Application Gallery</h1> 
            <p> 
             Lorem ipsum dolor sit amet, consectetur adipisicing elit. 
             A aliquid blanditiis consequuntur debitis deserunt eaque eligendi 
            </p> 
            <div className="blockfive__header--divider"></div> 
           </div> 
          </div> 
          <div className="blockfive__container__device"> 
           <h2> 
            Choose your device to what screenshots 
           </h2> 
           <ul className="tabs"> 
            { 
              sliderElements.map(item => 
              <li 
               key={item.id} 
               className="tab" 
               > 
               <a href="#" 
                onClick={ 
                 () => selectConfig(item.id) 
                } 
               > 
                {item.device} 
               </a> 
              </li> 
             ) 
            } 
           </ul> 
          </div> 
          <div className="blockfive__container__gallery"> 
           { 
             <Slider 
             width={width} 
             styles={sliderElements[config].styles} 
             device_image={sliderElements[config].image} 
            /> 
           } 
          </div> 
         </div> 
        </div> 
       </div> 
      ); 
     } 

     return null 
    } 
} 

const mapStateToProps = ({sliderElements, config}) => { 
    return { 
     sliderElements, 
     config 
    } 
}; 

export default connect(mapStateToProps, actions)(appDesign(BlockFour)); 

그래서,이 구문은 작동하고, 모든로드와 노력 (appDesign() 보지 말라,이 맥락에서 중요하지 않습니다). 그래서, 나는 질문 : AC에서 비동기 데이터를 가져 오는 올바른 방법은 무엇입니까 다음 그들을 감속기로 전달하고 구성 요소 내부에로드합니다. 내 구성 요소 내에서 if 문을 사용하고 싶지 않습니다.

비동기/대기 AC에 대한 몇 가지 가이드를 읽고이를 어떻게 사용하는지는 내 상황에서 어떻게 사용하는지 완전히 이해하지 못했습니다. 여기에 구현하는 방법을 알려주시겠습니까? 고맙습니다!

+0

당신은 데이터를 가지고있는 요청의 콜백에서 요청 (가져 오기 또는 사용하려는 라이브러리)을 수행합니다. 그런 다음 데이터를 감속기로 보냅니다. –

+0

그게 당신이하는 일입니다. 전혀 문제 없습니다. – WilomGfx

+0

@WilomGfx 그래, 작동하지만 사람들이 세 개의 AC 즉 DATA_IS_FETCHING, DATA_IS_FETCHED 및 DATA_IS_LOADED를 쓰는 몇 가지 안내서를 읽습니다. 그리고 나는이 접근법을 이해하지 못한다. 여기서는 사용해야한다. – Remzes

답변

1

저는 개인적으로 대부분의 사람들이 이것을 따르고 있습니다. approach. 완전히 개인적이고 앱에서 많이 변하지는 않겠지 만 인생을 더 쉽게 만들 수 있습니다.

{ type: 'FETCH_POSTS_REQUEST' } 
{ type: 'FETCH_POSTS_FAILURE', error: 'Oops' } 
{ type: 'FETCH_POSTS_SUCCESS', response: { ... } } 

이렇게하면 UI와 상점에 연결된 앱의 다른 부분이 상태에 따라 적절하게 작동 할 수 있습니다.

Exemples은 다음과 같습니다 FETCH_SMTH_REQUEST 해고 및 오류 FETCH_SMTH_FAILURE을 가져 와서 보여주는로 상태 변화 당신이 당신의 상태로 error을받을 때 로딩 아이콘이나 메시지를 표시합니다.