Keer terug van een belofte dan()

Ik heb een javascript-code zoals deze:

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

Ik heb altijd een ongedefinieerde waarde voor de var-test. Ik denk dat het komt omdat de beloften nog niet zijn opgelost..is er een manier om een ​​waarde terug te krijgen uit een belofte?


Antwoord 1, autoriteit 100%

Als je iets terugstuurt van een then()callback, is dat een beetje magisch. Als je een waarde retourneert, wordt de volgende then()aangeroepen met die waarde. Als u echter iets belooft dat lijkt op een belofte, wacht de volgende then()erop en wordt alleen aangeroepen wanneer die belofte wordt afgehandeld (slaagt/faalt).

Bron: https://web.dev/promises/#queuing-asynchronous-actions


Antwoord 2, autoriteit 46%

Om een ​​belofte te gebruiken, moet je ofwel een functie aanroepen die een belofte creëert, of je moet er zelf een maken. Je beschrijft niet echt welk probleem je echt probeert op te lossen, maar zo zou je zelf een belofte creëren:

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

Snippet uitvouwen


Antwoord 3, autoriteit 12%

Wat ik hier heb gedaan, is dat ik een belofte heb teruggestuurd van de functie justTesting. U kunt dan het resultaat krijgen wanneer de functie is opgelost.

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

Hopelijk helpt dit!

// old answer
function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}
justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

Antwoord 4, autoriteit 7%

Ik gebruik liever het commando “wachten” en asynchrone functies om verwarring over beloften te voorkomen,

In dit geval zou ik eerst een asynchrone functie schrijven,
dit zal worden gebruikt in plaats van de anonieme functie die wordt aangeroepen onder “promise.then” deel van deze vraag:

async function SubFunction(output){
   // Call to database , returns a promise, like an Ajax call etc :
   const response = await axios.get( GetApiHost() + '/api/some_endpoint')
   // Return :
   return response;
}

en dan zou ik deze functie aanroepen vanuit de hoofdfunctie :

async function justTesting() {
   const lv_result = await SubFunction(output);
   return lv_result + 1;
}

Ik merk op dat ik zowel de hoofdfunctie als de subfunctie heb teruggestuurd naar asynchrone functies hier.

Other episodes