У меня есть код, в котором функция (которая содержит обещание) запускается, а затем возвращает логическое значение. Затем я проверяю, верно ли это значение, и если да, то запускаю другой код. У меня были значения, записываемые в консоль для выполнения некоторой отладки, и я заметил, что оператор if, который проверяет, возвращает ли функция значение true, выполнялся еще до того, как функция возвращала что-либо.
Я пытался использовать «ожидание» и «асинхронность», но не нашел никакого успеха в их использовании.
javascript
function myFunc()
promise()
.then(value => {
console.info('Returned true');
return true;
})
.catch(err => {
console.info('Error', err);
});
end
if (myFunc()) {
console.info('Value was true');
} else {
console.info('Value was false');
}
Ожидал:
Returned true
Value was true
Действительный:
Value was false
Returned true
Вы пытаетесь вернуть обещание из своей функции, в тот момент, когда вы используете обещания, вы работаете с асинхронным кодом. Это означает, что для того, чтобы получить значение из промиса, сначала нужно выполнить обещание.
В вашем случае вы оцениваете возвращаемое значение вашей функции, а не возвращаемое значение обещания. Поскольку у вас нет явного возврата в вашей функции, она возвращает неопределенное значение. Вот почему вы видите value was false
в консоли. Затем ваше обещание выполняется, и вы видите Returned true
в консоли, но вы никогда не оценивали это значение, возвращаемое обещанием.
Предположим, что вы вызываете свою функцию из глобальной области видимости, вам нужно будет использовать синтаксис .then, чтобы получить доступ к значению, возвращаемому вашим обещанием.
Итак, если ваша функция выглядит примерно так:
function myFunc() {
return Promise.resolve()
.then(value => {
console.info('Returned true');
return true;
})
}
Ваш оператор if должен превратиться в что-то вроде этого:
myFunc().then(value => {
if (value) console.info('It is true')
else console.info('Is it false')
})
По сути, вы ждете, пока ваше обещание будет выполнено, и когда это произойдет, вы получите возвращаемое значение по параметру (в этом простом примере это всегда верно, но также может быть и ложным).
Я надеюсь, это поможет вам.
Попробуйте вернуть обещание из функции:
function myFunc()
return promise()
.then(value => {
console.info('Returned true');
return true;
})
.catch(err => {
console.info('Error', err);
});
end
if (myFunc()) {
console.info('Value was true');
} else {
console.info('Value was false');
}
Это не лучшая практика, я бы придерживался старой доброй цепочки обещаний:
promise()
.then(value => {
if (value) {
console.info('Value was true');
} else {
console.info('Value was false');
}
})
.catch(err => {
console.info('Error', err);
});
Вам нужно использовать «ожидание», чтобы дождаться ответа обещания
promise = () => new Promise( (resolve, reject ) => resolve(true) );
async function myFunc(){
try {
let value = await promise();
if (value === true){
console.info('Returned true');
return true;
}
} catch (err) {
console.info('Error', err);
}
}
async function main(){
if ( await myFunc() ) {
console.info('Value was true');
} else {
console.info('Value was false');
}
}
main();