Não to conseguindo retornar o array corrigido pelo "resolve"

Estou com o problema abaixo fiz as funções mas estou tendo problemas e retornar o array corrigido pelo “resolve”.

Escreva duas funções javascript (ES6) usando a técnica de promisses. A primeira
função, colocarTodasPalavrasEmMaiusculo(), receberá um array de palavras e as colocará
em maiúsculo. Nesta primeira função, o uso da função map (de Array) é obrigatório (acredito
que você já saiba a razão). Verifique, dentro do escopo da função map, se o array possui
valores que não são Strings, e se houver valores que não são String, um erro deve ser gerado.
A segunda função, ordenarPalavras(), realizará uma ordenação nas palavras por ordem
alfabética. Nesta segunda função, utilize a função forEach (de Array) para verificar se o
array possuir valores que não são Strings, caso haja valores que não são String, gere um erro.
Atenção: você deverá utilizar encadeamento de funções.

const colocarTodasPalavrasEmMaiusculo = (arr) => new Promise((resolve, reject) => {
  if (arr.filter((elem) => typeof(elem) != "string").length) {
    reject("O elemento não é uma String!")
  } else {
    resolve(arr.map((elem) => elem.toUpperCase()))
  }
});

const ordenarPalavras = (arr) => new Promise((resolve, reject) => {
  if (arr.filter((elem) => typeof(elem) != "string").length) {
    reject("O elemento não é uma String!")
  } else {
    resolve(arr.forEach(element => {
      console.log(element.split('').sort().toString().replace(/,/g,""))
      element.split('').sort().toString().replace(/,/g,"")
    }))
  }
})

colocarTodasPalavrasEmMaiusculo(['cba','fed','ihg'])
  .then(ordenarPalavras)
  .then((e) => console.log(e))
  .catch((e) => {
    console.log(e)
  })

Executei seu código e o retorno foi esse:

ABC
DEF
GHI

Parece que está certo. Não deveria ser isso msm?

Ah cara, entendi. Agora que reparei que está retornando undefined. Isso pq o forEach devolve undefined (FONTE: Array.prototype.forEach()).

Estou tentando usar a captura de exceção do forEach, mas não sei onde estou errando…

const colocarTodasPalavrasEmMaiusculo = (arr) => new Promise((resolve, reject) => {
if (arr.filter((elem) => typeof(elem) != “string”).length) {
reject(“O elemento não é uma String!”)
} else {
resolve(arr.map((elem) => elem.toUpperCase()))
}
});

const ordenarPalavras = (arr) => new Promise((resolve, reject) => {
  try {
arr.forEach((elem) => typeof(elem) != "string").length){
  reject("O elemento não é uma String!")
}; 
  }    
catch (e) {
    errorMsg = document.getElementById('errorMsg');
    errorMsg.innerHTML = "Error: " + e + ".";
}
})

colocarTodasPalavrasEmMaiusculo(['cba','fed','ihg'])
  .then(ordenarPalavras)
  .then((e) => console.log(e))
  .catch((e) => {
console.log(e)
  })

O exercício pede para usar o forEach para verifica se algum elemento não é string, e vc está usando filter (acho bem melhor o filter e acho que vc fez melhor assim).

Acho que na segunda função, vc deve verificar se há algum elemento que não seja string usando o forEach e lançar um Error caso encontre algum caso e, depois só fazer a ordenação.

Veja se a solução é válida:

const colocarTodasPalavrasEmMaiusculo = (arr) => new Promise((resolve, reject) => {
  resolve(arr.map((elem) => {
    if (typeof elem != 'string') {
      reject(`O elemento "${elem}" não é uma String!`);
    } else {
      return elem.toUpperCase();
    }
  }));
});

const ordenarPalavras = (arr) => new Promise((resolve, reject) => {
  arr.forEach((elem) => {
    if (typeof elem != 'string') {
      reject(`O elemento "${elem}" não é uma String!`)
    }
  });

  resolve(arr.map(el => el.split('').sort().join('')));
});

colocarTodasPalavrasEmMaiusculo(['cba','fed','ihg'])
  .then(ordenarPalavras)
  .then((e) => console.log(e))
  .catch((e) => console.log(e));

Olá Lucas,

Agora deu certo!!!
Muito Obrigado!