等待来自其他文件React的axios服务器响应

时间:2019-07-27 08:34:51

标签: javascript reactjs axios

我有一个循环。在每一轮中,我需要将问题数据添加到MongoDB数据库中。这很好。但是,我想在循环进入下一轮之前获得新插入的 Question _id 。这是我有问题的地方。服务器返回 _id 并在该时间之前进入下一轮,需要一定的时间。因此,我需要一种方法来等待服务器响应,并且只有在该响应移至下一轮循环之后。

这是我的后端代码:

router.post("/createQuestion", (req, res) => {
  const newQuestion = new Question({
    description: req.body.description,
    type: req.body.type, 
    model: req.body.model
  });
  newQuestion.save().then(question => res.json(question._id))
  .catch(err => console.log(err));
});

这是我的axios函数,它在一个单独的文件中,并导入到类中:

export const createQuestion = (questionData) => dispatch => {
  axios.post("/api/scorecard/createQuestion", questionData)
    .then(res => {
      return res.data;
    }).catch(err =>
         console.log("Error adding a question")
    );
};

这是我班上的代码:

JSON.parse(localStorage.getItem(i)).map(question => {
      const newQuestion = {
        description: question.description,
        type: question.questionType,
        model: this.props.model
      }
       const question_id =  this.props.createQuestion(newQuestion);
       console.log(question_id);
}

控制台显示 undefined

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我通过将数组问题发送到节点并逐个读取问题并使用下一个Question ID更新来解决了同样的问题。

router.post("/createQuestion", (req, res) => {
let d =[questionarray];
let i = 0;
        let length = d.length;
        var result = [];
        try {
            const timeoutPromise = (timeout) => new Promise((resolve) => setTimeout(resolve, timeout));
            for (i = 0; i < length; i++) {
                await timeoutPromise(1000);   // 1000 = 1 second
                let CAT_ID = parseInt(d[i].CAT_ID);
                let TOPIC_ID = parseInt(d[i].TOPIC_ID);
                let Q_DESC = (d[i].Q_DESC);
                let OPT_1 = (d[i].OPT_1);
                let OPT_2 = (d[i].OPT_2);
                let OPT_3 = (d[i].OPT_3);
                let OPT_4 = (d[i].OPT_4);
                let ANS_ID = (d[i].ANS_ID);
                let TAGS = (d[i].TAGS);
                let HINT = (d[i].HINT);
                let LEVEL = d[i].LEVEL;
                let SRNO = d[i].SrNo;
                let qid;

                const savemyData = async (data) => {
                    return await data.save()

                }
                var myResult = await Question.find({ TOPIC_ID: TOPIC_ID }).countDocuments(function (err, count) {
                    if (err) {
                        console.log(err);
                    }
                    else {
                        if (count === 0) {
                            qid = TOPIC_ID + '' + 10001;
                            const newQuestion = new Question({
                                Q_ID: qid,
                                CAT_ID: CAT_ID,
                                TOPIC_ID: TOPIC_ID,
                                Q_ID: qid,
                                Q_DESC: Q_DESC,
                                OPT_1: OPT_1,
                                OPT_2: OPT_2,
                                OPT_3: OPT_3,
                                OPT_4: OPT_4,
                                ANS_ID: ANS_ID,
                                HINT: HINT,
                                TAGS: TAGS,
                                LEVEL: LEVEL,
                                Q_IMAGE: ''
                            })

                            await savemyData(newQuestion)
                                .then(result => { return true })
                                .catch(err => { return false });
                            //`${SRNO} is added successfully`
                            //`${SRNO} is Failed`

                        }

                        else if (count > 0) {
                            //   console.log(count)
                            Question.find({ TOPIC_ID: TOPIC_ID }).sort({ Q_ID: -1 }).limit(1)
                                .then(question => {
                                    qid = question[0].Q_ID + 1;
                                    const newQuestion = new Question({
                                        Q_ID: qid,
                                        CAT_ID: CAT_ID,
                                        TOPIC_ID: TOPIC_ID,
                                        Q_ID: qid,
                                        Q_DESC: Q_DESC,
                                        OPT_1: OPT_1,
                                        OPT_2: OPT_2,
                                        OPT_3: OPT_3,
                                        OPT_4: OPT_4,
                                        ANS_ID: ANS_ID,
                                        HINT: HINT,
                                        TAGS: TAGS,
                                        LEVEL: LEVEL,
                                        Q_IMAGE: ''
                                    })
                                    await savemyData(newQuestion)
                                        .then(result => { return true })
                                        .catch(err => { return false });

                                })
                                .catch(err => console.log(err));
                        }
                    }
                });
                if (myResult)
                    result.push(`${SRNO} is added successfully`);
                else
                    result.push(`${SRNO} is Failed`);
            }
            //      console.log(result)
            return res.json(result);
        }
        catch (err) {
            //res.status(404).json({ success: false })
            console.log(err)
        }
});

答案 1 :(得分:0)

首先,您的函数createQuestion不返回值,因此分配给question_id始终是不确定的。无论如何,由于您的createQuestion函数中有一个调度,所以我假设您使用redux,所以我建议您使用redux-thnk,将获取新的动作逻辑拆分为重动作,并使用redux状态中的问题ID值,而不是返回createQuestion中的值。您可以在课堂上听questionID的更改,如果发生更改,请分派下一个问题的保存。