【发布时间】:2021-10-19 08:40:30
【问题描述】:
编辑:
问题不在于 async/await 本身的放置,而是我试图使构造函数异步的事实。
我浏览了文档,阅读了其他问题和答案,但我仍然无法理解要异步的函数,以及在哪里放置等待,以获得我想要的行为。
基本上,我希望构造函数中的console.log(this.data) 注销我获取的数据,但现在它会注销待处理的Promise。
我已经尝试了所有我能想到的东西,我总是以退出 Promise 或 undefined 结束。
我在哪里可以在这些方法中添加 async/await 以使其在构造函数中注销获取的数据?
如果我以完全错误的方式处理此问题,请告诉我。
class Apa {
constructor () {
this.ajaxURL = 'https://example.com/api/';
this.mockParams = {
title: 'foo',
body: 'bar',
userId: 1
};
this.data = this.getData(this.mockParams).then(xhr => this.data = JSON.parse(xhr.response)).catch(xhr => this.data = {});
console.log(this.data);
}
getData(params) {
return new Promise((resolve, reject) => {
let request = this.postAjax(this.ajaxURL, params);
request.then((xhr) => {
resolve(xhr);
}).catch((xhr) => {
this.errorMessage = 'Ajax request failed: getData()';
reject(xhr);
});
});
}
postAjax(url, data) {
return new Promise((resolve, reject) => {
var params = typeof data == 'string' ? data : Object.keys(data).map(
function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
).join('&');
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open('POST', url);
xhr.onreadystatechange = function() {
if (xhr.readyState>3 && xhr.status==200) { resolve(xhr); }
};
xhr.onerror = () => reject(xhr);
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(params);
});
}
}
注意: 我知道这个类不能按原样工作,我不得不用模拟的东西替换真正的 API 端点,但我可以确保你在调用真正的 API 时没有问题。承诺(解决后)确实包含具有正确响应的真正 XMLHttpRequest。
【问题讨论】:
-
顺便说一句,没有必要在
getData中创建Promise,因为函数this.postAjax已经返回一个 -
我不认为构造函数可以是
async,所以你将无法使用异步/等待,只需使用承诺。然后就像你已经在你的代码的其余部分中一样 -
@JaromandaX 没错,我尝试异步构造函数时出错
-
是的,但是
console.log(this.data);在构造函数中,并且不会“等待”上一行中的承诺解决 - 并且您不能在构造函数中使用 async/await(直接)
标签: javascript promise async-await xmlhttprequest