web-dev-qa-db-fra.com

Revenir d'une promesse then ()

J'ai un code javascript comme ceci:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

J'ai toujours une valeur indéfinie pour le test var. Je pense que c’est parce que les promesses ne sont pas résolues jet..il y a-t-il un moyen de retourner une valeur d’une promesse?

86
Priscy

Lorsque vous renvoyez quelque chose à partir d'un rappel then(), c'est un peu magique. Si vous retournez une valeur, la prochaine then() est appelée avec cette valeur. Cependant, si vous retournez quelque chose qui ressemble à une promesse, la prochaine then() l'attend et n'est appelée que lorsque cette promesse se règle (réussit/échoue).

via https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing_asynchronous_actions

108
c0ming

Pour utiliser une promesse, vous devez soit appeler une fonction qui crée une promesse, soit en créer une vous-même. Vous ne décrivez pas vraiment le problème que vous essayez réellement de résoudre, mais voici comment créer une promesse vous-même:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

Ou, si vous avez déjà une fonction qui retourne une promesse, vous pouvez utiliser cette fonction et retourner sa promesse:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}
46
jfriend00

Ce que j'ai fait ici, c'est que j'ai retourné une promesse de la fonction justTesting. Vous pouvez alors obtenir le résultat lorsque la fonction est résolue.

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

J'espère que cela t'aides!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }
8
Vidur Singla

Pour moi, callback a fonctionné dans cette situation. J'avais le même problème et toutes les réponses précédentes ne fonctionnaient pas pour moi (je ne sais pas vraiment pourquoi). Donc, exemple du code qui devrait fonctionner:

function justTesting(callback) {
  promise.then(function(output) {
    return output + 1;
  });
}

then call it:

justTesting(function (yourOutput) {
    // here you can use your outpur from justTesting func
    var test = yourOutput;
})  
0
Ustin