Estoy siguiendo la especificación aquí y no estoy seguro de si permite llamar a onFulfilled con múltiples argumentos. Por ejemplo:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
tal que mi código:
promise.then(function(arg1, arg2){
// ....
});
recibiría ambos arg1
y arg2
?
No me importa cómo lo hace una implementación de promesas específicas, deseo seguir de cerca la especificación w3c para promesas.
javascript
promise
badunk
fuente
fuente
Respuestas:
No, solo el primer parámetro será tratado como valor de resolución en el constructor de promesa. Puede resolver con un valor compuesto como un objeto o matriz.
Ahí es donde creo que te equivocas. La especificación está diseñada para ser mínima y está diseñada para interoperar entre bibliotecas prometedoras. La idea es tener un subconjunto que los futuros de DOM, por ejemplo, puedan usar de manera confiable y las bibliotecas puedan consumir. Las implementaciones prometedoras hacen lo que pides
.spread
por un tiempo ahora. Por ejemplo:Con Bluebird . Una solución si desea esta funcionalidad es rellenarla.
Esto te permite hacer:
Con promesas nativas a gusto violín . O use spread, que ahora es (2018) común en los navegadores:
O con esperar:
fuente
.spread
como Bluebird; la razón por la que no está en la especificación es que mantener la especificación mínima es realmente un gran problema para permitir la interoperabilidad entre el código y las bibliotecas.Promise.all
a la matriz antes de aplicar la función en lugar de solo.then
usarla para manejar algunas bibliotecas de azúcar. No es obligatorio, pero es lindo.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
Es un tapón. El ES6 introduce la desestructuración y el operador de reposo / dispersión, que eliminan la necesidad de un usospread
directo..then(([a, b, c]) => {})
Puede usar la desestructuración E6:
Desestructuración de objetos:
Desestructuración de la matriz:
fuente
El valor de cumplimiento de una promesa es paralelo al valor de retorno de una función y la razón de rechazo de una promesa es paralela a la excepción lanzada de una función. Las funciones no pueden devolver múltiples valores, por lo que las promesas no deben tener más de 1 valor de cumplimiento.
fuente
Por lo que puedo decir, leer la especificación de Promesa ES6 y la especificación de promesa estándar no hay cláusula que impida que una implementación maneje este caso; sin embargo, no está implementado en las siguientes bibliotecas:
Supongo que la razón por la que omiten las resoluciones de múltiples argumentos es hacer que el orden de cambio sea más sucinto (es decir, como solo puede devolver un valor en una función, haría que el control fluya menos intuitivo) Ejemplo:
fuente
return Promise.of(x, y)
lugar de un valor escalar de lathen
devolución de llamada.Aquí hay una solución CoffeeScript.
Estaba buscando la misma solución y encontré algo muy interesante de esta respuesta: Rechazar promesas con múltiples argumentos (como $ http) en AngularJS
la respuesta de este chico Florian
Y para usarlo:
fuente
->
ser=>
?Gran pregunta y gran respuesta de Benjamin, Kris y otros. ¡Muchas gracias!
Estoy usando esto en un proyecto y he creado un módulo basado en el código de Benjamin Gruenwald . Está disponible en npmjs:
Luego, en su código, haga
Si está utilizando una biblioteca como
any-promise
¡Quizás otros también encuentren esto útil!
fuente
La desestructuración de la asignación en ES6 ayudaría aquí. Por ejemplo:
fuente
Dado que las funciones en Javascript se pueden invocar con cualquier número de argumentos, y el documento no impone ninguna restricción a los
onFulfilled()
argumentos del método además de la cláusula siguiente, creo que puede pasar múltiples argumentos alonFulfilled()
método siempre que el valor de la promesa sea el primer argumentofuente
Para citar el siguiente artículo, "" luego "toma dos argumentos, una devolución de llamada para un caso de éxito y otro para el caso de falla. Ambos son opcionales, por lo que puede agregar una devolución de llamada solo para el caso de éxito o falla".
Por lo general, busco en esta página cualquier pregunta básica sobre promesas, avíseme si estoy equivocado
http://www.html5rocks.com/en/tutorials/es6/promises/
fuente
new Promise
tiene la sintaxisfunction(resolve, error)
mientras quethen
tiene la sintaxis.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})