1
votes

Comment définir la réponse d'une promesse à une variable

J'ai une fonction asynchrone qui renvoie une valeur

 promotion = { 
    name: productN,
    startDate: start,
    endDate: end
 };

dans une autre fonction, j'appelle cette fonction get username comme ceci

let productN;
const prod = this.getUsername(env,skuName,token).then((resp) => {
    productN= resp;
    this.wait(300);
});

la variable productN fonctionne, car je peux voir la réponse dans mon journal, mais lorsque j'essaie d'utiliser productN en dehors de ce bloc, je rencontre undefined.

  async getUsername(env:string,skuName: string,token:string): Promise<any> {
      let value =  await this.getDeviceName(env,skuName,token);
      return value;
  };

J'essaie de définir le nom sur productN, et je n'arrive tout simplement pas à le faire fonctionner.

Quelqu'un peut-il m'expliquer ce que je fais mal s'il vous plaît? Merci


2 commentaires

Vous pouvez attribuer une valeur à promotion.name lorsque vous recevez la réponse. comme promotion.name = resp .


Parce que productN fonctionne avant que votre promesse ne soit résolue. C'est ainsi que fonctionne javascript.


3 Réponses :


2
votes

Vous pouvez soit attribuer la promotion lorsque vous recevez la réponse -

const input = [
    {
        env: 'lorem',
        skuname: 'skuname1',
        token: 'dummy'
    }, 
    {
        env: 'lorem',
        skuname: 'skuname2',
        token: 'dummy'
    }
];

const getUserName = (username) => {
    return new Promise(resolve => {
        setTimeout(()=>resolve(username), 2000);
    });
};

(async () => {
    const resp = await Promise.all(input.map(({skuname}) => getUserName(skuname)));
    console.log(resp);
})();

// Or 

Promise.all(input.map(({skuname}) => getUserName(skuname)))
    .then(resp => {
        console.log(resp);
    });

Puisque votre getUsername est asynchrone, vous pouvez attendre pour la réponse en utilisant wait , puis affectez à l'objet promotion .

(async() => {
  const resp = await this.getUsername(env,skuName,token);
  promotion = {
    name: resp,
    startDate: start,
    endDate: end
  } 
})();

--- Edit --- p>

const prod = this.getUsername(env,skuName,token).then((resp) => {
    productN =  resp;
    promotion.name = resp
    this.wait(300);
});


2 commentaires

hey @randomSoul, Merci pour la réponse rapide, j'ai essayé vos deux réponses .... Quand j'ai utilisé la première, seule la dernière ligne du tableau reprend promotion.name, la première ligne 10 n'est pas définie. Quand j'ai essayé le deuxième, toutes les données du tableau étaient vides.


la promotion est un objet. Ainsi, chaque fois que vous attribuez une nouvelle valeur, la valeur précédente est remplacée. Il semble qu'il existe plusieurs enregistrements, vous pouvez créer un tableau de promesses et ensuite utiliser promise.all . Ainsi, une fois qu'ils sont tous exécutés, vous pouvez les afficher dans le tableau.



0
votes

Essayer

const productN = await this.getUsername(env,skuName,token);
console.log(productN);


0 commentaires

0
votes

Pouvez-vous essayer de faire ça? Renvoyez votre fonction getDeviceName dans getUsername;

getUsername(env:string, skuName: string, token:string): Promise<any> {
 return New Promise(async (resolve,reject)=>{
  try {
   let value =  await this.getDeviceName(env,skuName,token);
   ...
   //all other things you want to do here 
   ...
   resolve(value);
  } catch (error) {
   reject(error)
  }
 }
};

const productN = await this.getUsername(env, skuName, token);
console.log(productN);

Je ne sais pas pourquoi vous utilisez getUsername . puisque vous pouvez obtenir la valeur dans productN directement à partir de getDeviceName .

comme

const productN = await this.getDeviceName(env, skuName, token);

Si vous voulez faire d'autres choses dans getUsername . vous pouvez lui faire retourner une promesse.

getUsername(env:string, skuName: string, token:string): Promise<any> {
  return this.getDeviceName(env, skuName, token);
};
const productN = await this.getUsername(env, skuName, token);
console.log(productN);

nb: J'ai utilisé le bloc try catch pour la gestion des erreurs, ignorez-le si vous ne le souhaitez pas .


0 commentaires