Cómo pasar un parámetro a una función de promesa


122

esta puede parecer una pregunta tonta, pero soy un novato en este tema. Estoy trabajando en promesas en el nodo js. Y quiero pasar un parámetro a una función de promesa. Sin embargo, no pude entenderlo.

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

y la función es algo como

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
No hay razón para hacer eso, solo puede definir usernamey passworden un alcance mayor
adeneo

Pero estoy llamando a la promesa desde otro módulo, y también el nombre de usuario y la contraseña no son estáticos sino que provienen del lado del cliente. ¿Es seguro definir algún tipo de variable global que una función establece y la otra usa? ¿Existe el riesgo de que otro cliente cambie la variable?
kundante

1
@kundante No necesitas globales. Más información sobre cierres.
SLaks

@adeneo la promesa es asincrónica: ¿qué pasa si invoca la función por segunda vez antes de que se resuelva la primera promesa?
Mawg dice reinstalar a Monica

Respuestas:


234

Envuelva su Promesa dentro de una función o comenzará a hacer su trabajo de inmediato. Además, puede pasar parámetros a la función:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

Entonces, úsalo:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

Utilizar:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

lo que es someModule?
Si8

3
Es solo un ejemplo del OP
Shanoor

3
@Shanoor ¿Qué es uid? ¿Es la cadena "¡Las cosas funcionaron!"?
Old Geezer

2
@OldGeezer, es solo una variable para contener el retorno de la promesa. En este caso, sí, eso sería "¡Las cosas funcionaron!".
Shanoor

¿Sabes cómo llamar a una función desde la clase principal dentro de la nueva promesa?
TimeParadox

7

Otra forma ( debe intentarlo ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
Su ejemplo sería mejor si resuelve con una matriz u objeto que deconstruye de modo que se muestren múltiples argumentos y la promesa detallada se cree ya resuelta así: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Creo que está mal ya que el segundo parámetro al que se le pasa thenes una devolución de llamada para manejar el valor de retorno de la función de rechazo . En lugar de resolve('Success!');intentar reject('Error');, obtendremos un error: Unhandled promise rejectionaquí vemos el resultado porque var extraData = 'ImExtraData';es una variable global y NO porque la pasamos usandothen
Shakiba Moshiri

Si no lo pasa, no puede acceder a él ya que no tiene un alcance en la promesa / entonces si no lo pasa.
sadiq

tratar de eliminarlo y ver si funciona o no? codepen.io/k-five/pen/ZNOvKG vea el registro de la consola en su navegador
Shakiba Moshiri

Aprecio su codepen, pero use dos variables diferentes y luego vea el factor real. EVITE la MISMA VARIABLE. Si solo la variable global funcionó bien, no necesitamos pasar un parámetro adicional.
sadiq

1

Aun mas corto

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});

0

Puede usar .bind () para pasar el parámetro ( this ) a la función.

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

tengo esta función de cómo editarlo para aceptarlo .then()cuando lo invoco en un botón ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Proveedor const {imágenes} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , ruta); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (archivo);}); }; `@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> script es `var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code * /})}; función SaveImagesToFirebase (resolver, rechazar) {/ * código * / resolver (/ * ??? * /);} `
gogog
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.