javascript - 我可以使用构造函数内部第 3 方库的异步调用填充数组吗?
问题描述
我有一个带有数组属性的对象,我想用从异步调用收到的响应来填充它。此调用是由接收回调函数的第 3 方库中的方法进行的,所以我尝试了这样的方法:
class Foo {
constructor() {
this.myArray = [];
thirdPartyObject.thirdPartyMethod(
param1,
param2,
function(data){ //success callback
data.forEach(item => {
var myArrayEle = {
propertyA : item.propertyA,
propertyB : item.propertyB
};
this.myArray.push(myArrayEle);
})
},
function(data){ //error callback
throw "Error"
}
)
}
}
this.SomeArray.push(myArrayEle);
我在说“无法读取未定义的 myArray 属性”时收到错误消息。
我不想简单地对响应做一些事情然后放手,因为我想保存这个数组,这样我就可以根据用户所做的事情来做一些事情,而不必稍后再打电话来获得相同的结果数据。
有没有办法在构造函数中做到这一点,或者我必须在其他地方使用承诺来做到这一点?
解决方案
处理这个问题的一种方法是在你的类上有一个构造函数,它只是设置东西和一个不同的 init 函数,它可以处理异步获取数据并让你知道对象何时正确初始化。这是我们模拟您的thirdPartyMethod
. 当你调用构造函数时,数组将是未定义的,但你可以调用init().then()
它来知道它什么时候准备好:
const thirdPartyObject = {
thirdPartyMethod(param1, param2, success, error) {
setTimeout(() => success([{propertyA: "propA0",propertyB: "propB0"}, {propertyA: "propA1",propertyB: "propB1"
}]), 1000)
}
}
class Foo {
constructor(data) {
console.log("making instance")
this.myArray = data;
}
init() {
console.log("starting init")
return new Promise((resolve, reject) => {
thirdPartyObject.thirdPartyMethod(
'param1','param2',
(data) => { //success callback // use arrow function so 'this' works
this.myArray = data.map(item => {
return {
propertyA: item.propertyA,
propertyB: item.propertyB
};
})
console.log("finished init, data ready")
resolve(true)
},
function(data) { //error callback
reject("Error")
}
)
})
}
}
let f = new Foo()
f.init()
.then(() => console.log(f.myArray))
.catch(err => console.log(err))
推荐阅读
- windows - 有多少 Windows 用户将 UTF-8 设置为代码页?
- sql - 为什么我收到“缺少表达式”错误?
- javascript - 如何根据环境变量在反应应用程序中包含脚本标签
- r - 组合列表而不丢失其结构
- kafka-python - 使用 GSSAPI 的 SASL_SSL 无法连接
- c# - 如何避免在 OnTriggerEnter() 中调用 GetComponent()?
- c - 按C中的第一列对动态分配的二维数组进行排序
- acumatica - 如何在操作的“文件”选项卡中附加 XML 文件
- html - 如何在类文件中包含 HtmlSanitazationLibrary
- javascript - 在 HTML 数据表上使用子元素数组