Como passar parâmetro para uma função de promessa

122

isso pode parecer uma pergunta boba, mas eu sou um novato neste tópico. Estou trabalhando em promessas no node js. E eu quero passar o parâmetro para uma função de promessa. No entanto, eu não conseguia descobrir.

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

e a função é 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"));
  }
});
kundante
fonte
1
Não há razão para fazer isso, você pode apenas definir usernamee passwordem um escopo mais amplo
adeneo
Mas estou chamando a promessa de outro módulo, e também o nome de usuário e a senha não são estáticos, mas vêm do lado do cliente. É seguro definir algum tipo de variável global que uma função define e a outra usa. Existe o risco de a variável ser alterada por outro cliente?
kundante
1
@kundante Você não precisa de nenhum global. Saiba mais sobre fechamentos.
SLaks de
@adeneo a promessa é assíncrona - e se ele invocar a função uma segunda vez antes que a primeira promessa seja resolvida?
Mawg diz para restabelecer Monica de

Respostas:

234

Envolva sua promessa dentro de uma função ou ela começará a fazer seu trabalho imediatamente. Além disso, você pode passar parâmetros para a função:

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"));
    }
  });
}

Então, use-o:

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"));
    }
  });
};

Usar:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});
Shanoor
fonte
o que é someModule?
Si8,
3
É apenas um exemplo do OP
Shanoor
3
@Shanoor O que é uid? É a string "Coisas funcionaram!"?
Velho Geezer
2
@OldGeezer, é apenas uma variável para conter o retorno da promessa. Nesse caso, sim, seria "Coisas funcionaram!".
Shanoor
você sabe como chamar uma função da classe pai dentro da nova promessa?
TimeParadox
7

Outra maneira ( deve tentar ):

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);

sadiq
fonte
2
Seu exemplo seria melhor se você resolver com um array ou objeto que você desconstrói de forma que vários argumentos sejam mostrados e a promessa detalhada seja criada já resolvida da seguinte forma: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465
1
Acho que está errado, pois o segundo parâmetro que é passado thené um retorno de chamada para manipular o valor de retorno da função de rejeição . Em vez de resolve('Success!');tentar reject('Error');, obteremos o erro: Unhandled promise rejectionAqui vemos a saída porque var extraData = 'ImExtraData';é uma variável global e NÃO por ser passada usandothen
Shakiba Moshiri
Se você não passar não poderá acessar pois não tem escopo prometido / então se não passar.
sadiq
tente removê-lo e ver se funciona ou não? codepen.io/k-five/pen/ZNOvKG veja o registro do console no seu navegador
Shakiba Moshiri
Agradeço seu código, mas use duas variáveis ​​diferentes e veja o fator real! EVITE A MESMA VARIÁVEL. Se apenas a variável global funcionou bem, não precisamos passar um parâmetro extra.
sadiq
1

Ainda mais curto

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

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

Você pode usar .bind () para passar o parâmetro ( this ) para a função.

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"}));
gogog
fonte
eu tenho essa função de como editá-lo para aceitar .then()quando eu invoco em um botão ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Provedor const {images} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , caminho); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (arquivo);}); }; `@gogog
DevAS
@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> o script é `var then_function = function (promessa) {nova promessa (promessa) .then (function (e) {/ * código * /})}; function SaveImagesToFirebase (resolver, rejeitar) {/ * code * / resolve (/ * ??? * /);} `
gogog