Вернитесь из обещания тогда ()
У меня есть код JavaScript, как это:
function justTesting() {
promise.then(function(output) {
return output + 1;
});
}
var test = justTesting();
У меня всегда есть неопределенное значение для теста var. Я думаю, что это потому, что обещания не решены струей.. есть ли способ вернуть значение из обещаний?
10 ответов
Когда вы возвращаете что-то из обратного вызова then(), это немного волшебно. Если вы возвращаете значение, функция next затем () вызывается с этим значением. Однако, если вы возвращаете что-то, похожее на обещание, функция next then() ожидает его и вызывается только тогда, когда это обещание завершается (успешно / неудачно).
через https://developers.google.com/web/fundamentals/getting-started/primers/promises
Чтобы использовать обещание, вы должны либо вызвать функцию, которая создает обещание, либо создать ее самостоятельно. Вы на самом деле не описываете, какую проблему вы действительно пытаетесь решить, но вот как вы бы сами создали обещание:
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);
}
Или, если у вас уже есть функция, которая возвращает обещание, вы можете использовать эту функцию и вернуть ее обещание:
// 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);
}
Что я сделал здесь, так это то, что я возвратил обещание от функции justTesting. Затем вы можете получить результат, когда функция будет решена.
function justTesting() {
return promise.then(function(output) {
return output + 1;
});
}
justTesting().then((res) => {
var test = res;
// do something with the output :)
}
Надеюсь это поможет!
Я предпочитаю использовать команду "await" и асинхронные функции, чтобы избавиться от путаницы с обещаниями,
В этом случае я сначала напишу асинхронную функцию, она будет использоваться вместо анонимной функции, вызываемой в части этого вопроса "обещание.then":
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;
}
а затем я бы вызвал эту функцию из основной функции:
async function justTesting() {
const lv_result = await SubFunction(output);
return lv_result + 1;
}
Отметив, что здесь я вернул как основную функцию, так и подфункцию асинхронным функциям.
Я думаю, что оригинальный постер хочет вернуть развернутое значение из обещания, фактически не возвращая другое обещание. Если не доказано обратное, я боюсь, что это невозможно вне
then()
или асинхронный/ожидающий контекст. Вы всегда получаете обещание, несмотря ни на что.
Promises
не "возвращают" значения, они передают их функции обратного вызова (которую вы предоставляете с помощью.then()).
Вероятно, он пытается сказать, что вы должны делать
resolve(someObject);
внутри реализации обещания.
Тогда в вашем
then
код, на который вы можете ссылаться
someObject
делать что хочешь.
Для меня callback работал в этой ситуации. У меня была та же самая проблема, и все предыдущие ответы не работали для меня (я действительно не знаю почему). Итак, пример кода, который должен работать:
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;
})
Вы не можете вернуть значение после выполнения обещания. Вместо этого вызовите другую функцию, когда обещание выполнено:
function justTesting() {
promise.then(function(output) {
// instead of return call another function
afterResolve(output + 1);
});
}
function afterResolve(result) {
// do something with result
}
var test = justTesting();
Вам необходимо использовать ссылочный тип данных, такой как массив или объект.
function foo(u,n){
let result = [];
const userBrands = new Promise((res, rej)=> {
res(['brand 1', 'brand 3']);
})
userBrands.then((ub)=>{
return new Promise((res, rej) =>{
res([...ub, 'brand 4', 'brand 5']);
})
}).then(response => {
return result.push(...response);
});
return result;
};
foo();
Просто сделай это:
async function justTesting() {
const output = await promise;
return (output + 1)
}
var test = justTesting();