Existe hoje várias implementações de promise para javascript. Todas acabam seguindo essa especificação.
As vantagens de utilizar promises e não callbacks é que você evita callback hells e cascatas de callback que deixam o código difícil de ler e entender.
EDIT: Coloquei um exemplos mais pertinentes que mostram o potencial de promises quando tem vários níveis de callback.
O nível de aninhamento pode se tornar muito maior que isso...e vai ficando cada vez mais complicado de entender.
Cada função faz apenas o que ela deve fazer e não precisa se preocupar em chamar callback ou saber o que a função que chamou ele está esperando.
@Guilherme Lautert , Como posso melhorar minha resposta para que ela seja aceita? Quais detalhes você acha que ficaram de fora? – Vinicius Zaramella 31/03/16 às 11:00
Promises (ou Promessas) são uma abstração utilizada para representar fluxos de ações em código assíncrono, sendo que em JavaScript uma Promise é um objeto que representa o resultado de uma operação assíncrona, podendo este resultado ser bem sucedido (gerado pela chamada da função resolve e que desencadeia a chamada do método then) ou mal sucedido (gerado pela chamada da função reject e que desencadeia a chamada do método catch). Um exemplo simples para ilustrar o conceito:
Nesse exemplo setTimeout é uma operação assíncrona que é transformada em uma Promise e atribuída a variável p. Assim nós temos a variável p que representa a promessa de alguma operação que eventualmente vai ocorrer, e neste caso ela ocorre após o tempo estipulado no timer, 1 segundo / 1000 milisegundos, momento em que é feito append da string "'Timer executado<br>'" e a Promise é finalizada|completa|resolvida através da chamada da função resolve, disparando assim o método then que executa a função de append da string "Promise resolvida".
Quanto a utilidade de Promises, esta se encontra na sua capacidade de representação de fluxo assíncrono de uma maneira compreensível para o desenvolvedor. Como exemplo veja como é o modo "tradicional/antigo" para representar tal fluxo em javascript:
Você tem funções assíncronas que recebem uma função anônima como parâmetro, sendo que esta função será executada quando a tal função assíncrona terminar sua execução. Não é difícil enxergar o problema aí, em séries de códigos assíncronos que precisam ser executados um após o outro você acaba com vários níveis de aninhamento, o chamado callback hell (não encontrei uma boa ref em PT). Promises resolvem esse problema, veja como o exemplo anterior poderia ser reescrito com o uso delas:
O código é mais claro na sua intenção e a representação é bem mais próxima de um fluxo síncrono onde você tem "faça isso, depois isso, depois aquilo". Embora sejam uma abstração não trivial promises são uma boa solução para o problema que é a representação de fluxo assíncrono em código.

node -version retorna alguma coisa? qual comando você está usando? npm install -g cordova ionic ? Tenta rodar com permissao su – Geferson 18/04/16 às 19:39
quando digito comando node --version ele retorna a minha versão, isso utilizo do próprio site: ionicframework.com/getting-started – Douglas William 18/04/16 às 19:41