使用轴和 Vue.js 进行异步/等待调用 - `.then()` 回调未更新 `this.something`

Posted

技术标签:

【中文标题】使用轴和 Vue.js 进行异步/等待调用 - `.then()` 回调未更新 `this.something`【英文标题】:Async/await calls with axis and Vue.js - `.then()` callback not updating `this.something` 【发布时间】:2019-02-02 02:32:53 【问题描述】:

在我的Vue 应用程序中设置我的this.values 之一时遇到了一点问题。我相信我要么没有正确理解 async axios 调用,要么没有正确理解 async 在axios 中的工作原理。

我的Vue 应用程序中有以下axios 发布方法:

postRequest: async function(event) 
    event.preventDefault();
    let config = 
        headers: 
            "X-CSRFToken": this.csrfToken,
            "Content-Type": 'application/x-www-form-urlencoded',
        
    

    let formData = new FormData();

    formData.append('data', someData);

    await axios.post(' request_absolute_uri ', formData, config).then(function(response) 
            this.responseMessage = response.data.message;
        ).catch(function(error) 
            console.log(error);
        );
    
    console.log(this.responseMessage)
    return this.responseMessage;

我的 response.data.message 正在从我的框架传回为 True/true,但似乎我没有从 postRequest 函数返回任何内容?该帖子肯定会到达服务器,因为日志记录显示了我想要的所有内容 - 然后在 json 响应上下文中返回 message = true(在返回相同的值之前直接使用 console.log(this.responseMessage)。但是,模板上没有任何更改或更新......

我现在假设我错过了一些非常简单的事情!

【问题讨论】:

Axios can't set data的可能重复 【参考方案1】:

嗯。我想我知道这里发生了什么:因为您使用的是标准function,所以.then() 回调中的this 不是指实例化对象...相反,this. 是调用该函数的上下文 - 使用您的原始代码,即 axios .post 方法返回的 Promise

相反,我建议使用箭头函数,以便从外部范围继承 this,类似于以下内容:

await axios.post(' request_absolute_uri ', formData, config).then( (response) => 
  this.responseMessage = response.data.message;
)

NB 对于箭头函数,this. 总是从外部范围继承,而不是依赖于箭头函数的调用上下文 - 所以你可以参考this.messagethis.someFunction() 轻松。

【讨论】:

对不起 - 我不确定这个答案与我的问题中的代码有什么不同...? @GCien 嗨,您缺少箭头函数 =>,如果不使用此函数,您的 this. 将始终引用 post 请求返回的函数,而不是您提供的上下文Vue 应用程序... 是的 - 我现在看到了,模板现在正在更新新消息!【参考方案2】:

我相信“this”超出了 .then 语句的范围。如果添加行:

var self = this;

在 postRequest 函数的顶部,然后在分配响应消息时使用:

self.responseMessage = response.data.message;

我认为应该可以。

【讨论】:

以上是关于使用轴和 Vue.js 进行异步/等待调用 - `.then()` 回调未更新 `this.something`的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 模板循环 - 异步 axios 调用

Vue.js 从外部 js 文件调用异步函数

如何在单元测试之前等待组件的挂载回调中的异步调用完成?

Vue.js如何检测组件/页面是否已完成所有异步调用?

Vue.js 和 D3.js - 力模拟

在 iOS 中等待多个网络异步调用