首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Promise chaining未返回预期结果

Promise chaining未返回预期结果
EN

Stack Overflow用户
提问于 2019-09-20 02:28:46
回答 1查看 64关注 0票数 0

我必须为一些用户发送一封电子邮件。我有一个返回用户id的承诺,另一个返回用户电子邮件的承诺(基于用户id)。我链接了所有这些函数,但是我的父函数得到了一个空数组。

我尝试了承诺和异步等待,但我对此几乎没有经验,我不知道我错过了哪里。

代码语言:javascript
复制
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。我无法访问数组项。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-20 03:35:06

您的问题是,不能保证在第一个函数返回时填充该数组。这是因为您从不等待getUserById调用的结果。这里有两种可能的解决方案(一种使用await /一种不使用await)

代码语言:javascript
复制
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)
    }
  );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58017050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档