Обрабатывать асинхронную операцию в Redux

#reactjs #if-statement #asynchronous #draftjs

#reactjs #if-оператор #асинхронный #draftjs

Вопрос:

Я пытаюсь выполнить рендеринг post.paragraph , поступающий из хранилища Redux.

Это код, который я использую:

     const postDetails = useSelector((state) => state.postDetails);
    const { loading, post, error } = postDetails; 

    const editorContent =   post ?
    EditorState.createWithContent(convertFromRaw(JSON.parse(post.paragraph))) : 
    EditorState.createEmpty();
    
    const [editorState, setEditorState] = useState({ editorState: editorContent });
    
    const handleEditorChange = (editorState) => { setEditorState({ editorState }) }
    
    const submitHandler = (e) => {
        e.preventDefault();
        dispatch(
          updatePost({
            _id: id,
            title,
            image,
            images,
            paragraph: JSON.stringify(
              convertToRaw(editorState.editorState.getCurrentContent())
            ),
          })
        );
      };
    
    <Editor
       editorState={editorState.editorState}
       onEditorStateChange={handleEditorChange}
     />
  

Хотя кажется, что для отображения требуется время post.paragraph , поэтому мое приложение терпит неудачу. На самом деле, если console.log(post.paragraph) я получаю «undefined» дважды, и только тогда я получаю свое post.paragraph отображение.

введите описание изображения здесь

Чтобы устранить проблему, я попытался поместить все в оператор if следующим образом:

     const postDetails = useSelector((state) => state.postDetails);
        const { loading, post, error } = postDetails; 
        const content = (async (err, res) => {
        const editorContent = await post.paragraph;
          if (post.paragraph) {
            res.send({ editorContent: EditorState.createWithContent(convertFromRaw(JSON.parse(post.paragraph))) });
          } else {
              res.send({ editorContent: EditorState.createEmpty()});
            }
            return editorContent;
          })
    
    
        const [editorState, setEditorState] = useState({ editorState: content });
        
        const handleEditorChange = (editorState) => { setEditorState({ editorState }) }
        
        const submitHandler = (e) => {
            e.preventDefault();
            dispatch(
              updatePost({
                _id: id,
                title,
                image,
                images,
                paragraph: JSON.stringify(
                  convertToRaw(editorState.editorState.getCurrentContent())
                ),
              })
            );
          };
        
        <Editor
           editorState={editorState.editorState}
           onEditorStateChange={handleEditorChange}
         />
  

Но теперь я получаю следующую ошибку:

введите описание изображения здесь

Я также попробовал следующее, но получаю ту же ошибку:

     const postDetails = useSelector((state) => state.postDetails);
        const { loading, post, error } = postDetails; 
          const editorContent =   !loading ?
    EditorState.createWithContent(convertFromRaw(JSON.parse(post.paragraph))) : 
    EditorState.createEmpty();
    
        const [editorState, setEditorState] = useState({ editorState: editorContent });
        
        const handleEditorChange = (editorState) => { setEditorState({ editorState }) }
        
        const submitHandler = (e) => {
            e.preventDefault();
            dispatch(
              updatePost({
                _id: id,
                title,
                image,
                images,
                paragraph: JSON.stringify(
                  convertToRaw(editorState.editorState.getCurrentContent())
                ),
              })
            );
          };
        
        <Editor
           editorState={editorState.editorState}
           onEditorStateChange={handleEditorChange}
         />
  

Как я должен решить этот асинхронный запрос? Большое спасибо!

Комментарии:

1. Вместо того, чтобы переходить к async await, вы можете использовать состояние загрузки, чтобы проверить, находится ли ожидающий вызов API, и если ответ загружен, затем установите начальное значение как post.paragraph . Попробуйте это. ` const [editorState, setEditorState] = useState({editorState: !загрузка? post.paragraph : ‘ ‘ }); `

2. Привет, спасибо. Я пытался, но это не работает. Смотрите отредактированный пост.