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
3 Réponses :
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); });
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.
Essayer
const productN = await this.getUsername(env,skuName,token); console.log(productN);
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 .
Vous pouvez attribuer une valeur à
promotion.name
lorsque vous recevez la réponse. commepromotion.name = resp
.Parce que productN fonctionne avant que votre promesse ne soit résolue. C'est ainsi que fonctionne javascript.