Axios代码不在`.then`之后运行

时间:2018-08-04 22:04:49

标签: javascript node.js reactjs express axios

我是React / nodejs / express / javascript的新手,遇到了以下问题:

我想获取一个数字,然后发布该数字+ 1,然后我要使用该数字(newFreshId创建一个新的js对象,然后添加该事件以将该事件添加到我的{{ 1}}。当我尝试运行代码时,可以获取并发布到schedulerData,但是/api/num之后的所有内容似乎都无法运行。

我想按顺序执行此操作,所以我在完成每项任务后都使用.then(function(response) {,这样我就不会遇到问题。

我还尝试删除所有.then,以使用while循环来等待值更改。这也没有用。

代码:

客户:

.then

服务器:

this.newEvent = (schedulerData, slotId, slotName, start, end, type, item) => {
    let newFreshId = 0;
    let newEvent = {}
    axios.get("/api/num").then(function(response) {
        newFreshId = response.data[0] + 1;

        // console.log(newFreshId);
    }).then(function() {
        axios.post("/api/num", {
            id: newFreshId
        }).then(function(response) {
            console.log(response)
            // handle success
            newEvent = {
                id: newFreshId,
                title: this.state.title,
                start: start,
                end: end,
                resourceId: slotId
            };
            schedulerData.addEvent(newEvent);
            this.setState({
                viewModel: schedulerData
            });

            // while(JSON.stringify(newEvent) === '{}'){
            //   console.log('waiting')
            // }

            console.log(newEvent)
            schedulerData.addEvent(newEvent);

            console.log(newEvent)
            this.setState({
                viewModel: schedulerData
            });
        })
    })
};

感谢所有帮助:)

2 个答案:

答案 0 :(得分:0)

fs.writeFileSync没有回调,因此您添加的函数永远不会执行:https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options

这意味着永远不会将响应发送回客户端,并且axios承诺也不会得到解决。

尝试将fs.writeFile与回调一起使用:https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback

在出现错误的情况下发送响应也是一个好主意。

app.post('/api/num', function(req, res) {
    var id = req.body.id
    var fs = require('fs');

    fs.writeFile("./number.json", "[ "+id+" ]", function(err) {
        if(err) {
            console.log(err);
            return res.status(200)
        }
        res.status(200)
    })
})

最后,尽管在这种情况下它无济于事,但您应该在axios链的最末端添加.catch。承诺链中发生的任何错误都将在那出现。

一个例子:

axios.get(specs).then(someFunction).catch(e => console.error(e));

答案 1 :(得分:0)

对我来说,我也面临着同样的问题,我发现这是因为发出发布请求后我正在使用一些重定向

window.location.href = "/{redirect to some rout}"

这使控制台立即更改,因此除非删除重定向,否则我看不到then响应。