javascript - Returnera från en promise then()
Jag har fått en JavaScript-kod som ser ut så här:
function justTesting() {
promise.then(function(output) {
return output + 1;
});
}
var test = justTesting();
Jag har alltid fått ett odefinierat värde för variabeln test. Jag tror att det beror på att löftena inte har lösts ännu... finns det ett sätt att returnera ett värde från ett löfte?
Svar #1
När du returnerar något från en then()-callback är det lite magiskt. Om du returnerar ett värde, kallas nästa then() med det värdet. Men om du returnerar något som liknar ett löfte, väntar nästa then() på det, och kallas först när det löftet har slutförts (lyckats/misslyckats).
Källa: https://web.dev/promises/#queuing-asynchronous-actions
Svar #2
För att använda ett löfte måste du antingen kalla på en funktion som skapar ett löfte eller så måste du skapa ett själv. Du beskriver egentligen inte vilket problem du verkligen försöker lösa, men här är hur du skulle skapa ett löfte själv:
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);
}Eller, om du redan har en funktion som returnerar ett löfte, kan du använda den funktionen och returnera dess löfte:
// 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);
}Svar #3
Det jag har gjort här är att jag har returnerat ett löfte från justTesting-funktionen. Du kan sedan få resultatet när funktionen är upplöst.
// 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);
});
Hoppas det här hjälper!
// old answer
function justTesting() {
return promise.then(function(output) {
return output + 1;
});
}
justTesting().then((res) => {
var test = res;
// do something with the output :)
}
Svar #4
Jag föredrar att använda kommandot "await" och asynkrona funktioner för att bli av med förvirringen kring löften.
I det här fallet skulle jag skriva en asynkron funktion först, detta kommer att användas istället för den anonyma funktionen som kallas under "promise.then" delen av denna fråga :
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;
}
och sedan skulle jag kalla på denna funktion från huvudfunktionen :
async function justTesting() {
const lv_result = await SubFunction(output);
return lv_result + 1;
}
Noterar att jag här återgav både huvudfunktionen och underfunktionen till asynkrona funktioner.
