reactjs - 承诺链接不返回预期结果
问题描述
我必须为某些用户发送电子邮件。我有一个返回用户 ID 的承诺和另一个返回用户电子邮件(基于用户 ID)的承诺。我有所有这些链接,但我的父函数得到一个空数组。
我尝试了承诺和异步等待,但我对此几乎没有经验,我不知道我在哪里失踪。
private async _getUserFromContatos(_subtipoEmergenciaID: number):Promise<string[]>{
const _arrTo: string[] = [];
sp.web.lists.getByTitle("Contato").items.get().then((items:any[]) => {
let _contatos = items.filter((i) => i.SubtipoEmergenciaId == _subtipoEmergenciaID);
_contatos.map(c => {
sp.web.getUserById(c.FuncionarioId).get().then(_userInfo => {
_arrTo.push(_userInfo.Email);
});
});
});
return _arrTo;
}
private _sendMail(){
this._getUserFromContatos(this.state.selectedSubtipoEmergencia).then(
_arrTo => {
console.log(_arrTo); //Returns the array as if its filled ok
console.log(_arrTo.length); //Returns 0 (empty array)
});
}
最后的第一个 console.log 返回填充的数组,但第二个返回 0。我无法访问数组项。
解决方案
您的问题是,当第一个函数返回时,不能保证数组被填充。那是因为您从不等待 getUserById 调用的结果。这里有两种可能的解决方案(一种使用 await / 一种不使用 await)
function _getUserFromContatos(_subtipoEmergenciaID: number): Promise<string[]> {
return sp.web.lists
.getByTitle("Contato")
.items
.get()
.then((items: any[]) => {
let _contatos = items.filter(i => i.SubtipoEmergenciaId == _subtipoEmergenciaID);
return Promise.all(
_contatos.map(c => {
sp.web
.getUserById(c.FuncionarioId)
.get()
.then(_userInfo => _userInfo.Email);
})
);
});
}
async function _getUserFromContatos(_subtipoEmergenciaID: number): Promise<string[]> {
var items = await sp.web.lists.getByTitle("Contato").items.get(); // await the list
let _contatos = items.filter(i => i.SubtipoEmergenciaId == _subtipoEmergenciaID);
var _arrTo: string[] = [];
for (var c of _contatos) {
var userInfo = await sp.web.getUserById(c.FuncionarioId).get(); // query every user and await that result
_arrTo.push(userInfo.Email);
}
return _arrTo;
}
function _sendMail() {
this._getUserFromContatos(this.state.selectedSubtipoEmergencia).then(
_arrTo => {
console.log(_arrTo); //Returns the array as if its filled ok
console.log(_arrTo.length); //Returns 0 (empty array)
}
);
}
推荐阅读
- opengl-es - GLSL 着色器错误:无法从“int 的 2 分量向量”转换为“float 的 2 分量向量”
- python - keras - AttributeError:'numpy.ndarray'对象没有属性'lower'
- rabbitmq - RabbitMQ 中的消费者特定(私有队列)
- playwright - 使用 Playwright devices api 可以使用哪些设备?
- c# - 从 ip 地址获取客户端主机名或 pc 名
- c# - 如何将公共变量的值传递给另一个脚本
- reactjs - 我可以传递具有额外结构价值的道具吗?
- selenium - 删除所有以前的数据后,如何获取“While”循环的最后更新值
- asp.net - 子应用的动态 url 链接
- flask - 如何使另一个 dockerized (react/typescript) 应用程序可以访问 dockerized flask 应用程序?