Estou seguindo as especificações aqui e não tenho certeza se permite que onFulfilled seja chamado com vários argumentos. Por exemplo:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
tal que meu código:
promise.then(function(arg1, arg2){
// ....
});
receberia ambos arg1
e arg2
?
Não me importo com o modo como qualquer implementação específica de promessas faz isso, desejo seguir de perto as especificações do w3c.
javascript
promise
badunk
fonte
fonte
Respostas:
Não, apenas o primeiro parâmetro será tratado como valor de resolução no construtor da promessa. Você pode resolver com um valor composto como um objeto ou matriz.
É aí que eu acredito que você está errado. A especificação foi projetada para ser mínima e foi criada para interoperar entre bibliotecas de promessas. A idéia é ter um subconjunto que os futuros do DOM, por exemplo, possam usar com segurança e as bibliotecas possam consumir. As implementações promissoras fazem o que você pede
.spread
há um tempo. Por exemplo:Com Bluebird . Uma solução, se você deseja essa funcionalidade, é polifillá-la.
Isso permite que você faça:
Com promessas nativas à vontade, brinque . Ou use propagação que é agora (2018) comum nos navegadores:
Ou com aguardar:
fonte
.spread
como Bluebird - a razão pela qual não está na especificação é que manter a especificação mínima é realmente um grande negócio para permitir a interoperabilidade entre código e bibliotecas.Promise.all
a matriz antes de aplicar a função, em vez de apenas.then
utilizá-la para lidar com algumas bibliotecas de açúcar fornecidas. Não é obrigatório, mas é fofo.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
é uma pechincha. O ES6 introduz a desestruturação e o operador de descanso / propagação, o que elimina a necessidadespread
imediata..then(([a, b, c]) => {})
Você pode usar a desestruturação E6:
Destruição de objetos:
Destruição da matriz:
fonte
O valor de cumprimento de uma promessa é paralelo ao valor de retorno de uma função e o motivo de rejeição de uma promessa é paralelo à exceção lançada de uma função. As funções não podem retornar vários valores, portanto, as promessas não devem ter mais de 1 valor de cumprimento.
fonte
Tanto quanto posso dizer, lendo a especificação ES6 Promise e a especificação padrão de promessa, não há nenhuma cláusula que impeça uma implementação de lidar com esse caso - no entanto, ela não é implementada nas seguintes bibliotecas:
Suponho que a razão pela qual eles omitem as resoluções com vários argumentos é tornar a ordem de mudança mais sucinta (ou seja, como você pode retornar apenas um valor em uma função, isso tornaria o fluxo de controle menos intuitivo).
fonte
return Promise.of(x, y)
vez de um valor escalar, dothen
retorno de chamada.Aqui está uma solução CoffeeScript.
Eu estava procurando a mesma solução e achei algo muito interessante nesta resposta: Rejeitar promessas com vários argumentos (como $ http) no AngularJS
a resposta desse cara Florian
E para usá-lo:
fonte
->
ser=>
?Ótima pergunta e ótima resposta de Benjamin, Kris, et al - muito obrigado!
Estou usando isso em um projeto e criei um módulo baseado no código de Benjamin Gruenwald . Está disponível no npmjs:
Então, no seu código, faça
Se você estiver usando uma biblioteca como
any-promise
Talvez outros achem isso útil também!
fonte
A desestruturação da atribuição no ES6 ajudaria aqui.
fonte
Como as funções em Javascript podem ser chamadas com qualquer número de argumentos, e o documento não impõe nenhuma restrição aos
onFulfilled()
argumentos do método além da cláusula abaixo, acho que você pode passar vários argumentos para oonFulfilled()
método desde que o valor da promessa seja o primeiro argumento.fonte
Para citar o artigo abaixo, "" then "recebe dois argumentos, um retorno de chamada para um caso de sucesso e outro para o caso de falha. Ambos são opcionais, portanto, você pode adicionar um retorno de chamada apenas para o caso de sucesso ou falha."
Normalmente, olho para esta página todas as perguntas básicas sobre promessas, deixe-me saber se estou errado
http://www.html5rocks.com/en/tutorials/es6/promises/
fonte
new Promise
tem a sintaxefunction(resolve, error)
enquantothen
tem a sintaxe.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})