承诺链未返回预期结果

时间:2019-09-19 18:28:46

标签: reactjs typescript sharepoint promise spfx

我必须向某些用户发送电子邮件。我有一个承诺,可以返回用户ID,另一个可以返回用户电子邮件(基于用户ID)。 我把所有这些都链接在一起,但是我的父函数得到一个空数组。

我尝试了Promise和async等待,但是对此我没有什么经验,我不知道我在哪里失踪。

{{1}}

最后的第一个console.log返回填充的数组,但是第二个返回0。 我无法访问数组项。

1 个答案:

答案 0 :(得分: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)
    }
  );
}