Обещание позвонить отдельно от обещания-разрешения
Я не очень знаком с обещаниями. Я хотел бы скрыть реализацию обещания от обещания вызова.
Пример:
function findFriends(req, res) {
const promiseFriend = MyFriendes.find({}).exec(); //call promise
if(friends.length===0){
logger.warn('No friendsavailible');
}else if(friends === undefined){
res.status(500).json({
error: 'INTERNAL ERROR'
});
}else{
res.status(200).json({
friends: friends
});
}
}
и я разрешу свое обещание в том же файле, но не в той же функции, где я вызываю это обещание.
promiseFriend
.then(function(friends){
return friends;
})
.catch(function(err){
logger.error({error:err});
});
Теперь я понимаю, что "обещание дружить" не определено. Как я могу отделить обещание-вызов от обещания-разрешения?
1 ответ
Если вы хотите определить обещание в функции и использовать его где-то еще, то прежде всего вам нужно вернуть обещание из той функции, которую вы не выполняете в своем коде. Затем вам нужно вызвать ту функцию, которую вы тоже не выполняете. И, наконец, вам нужно использовать then
обратный вызов возвращаемого значения, который вы не делаете в этом случае.
Нет смысла сохранять обещание в локальной переменной promiseFriend
это относится к этой функции. Также нет смысла возвращать значение в ваш then
Перезвоните: .then(function (friends) { return friends; })
- Понятия не имею, что здесь пытались сделать.
Я предполагаю, что findFriends
должен быть обработчиком маршрута для Express. Если это так, убедитесь, что вы отправляете ответ в каждом случае (который вы не делаете для friends.length===0
). Кроме того, вам нужно добавить then
обработчик сохраненного обещания, если вы хотите действовать, когда оно разрешено. Прямо сейчас у вас даже нет friends
определено в вашей функции. Также добавьте catch
обработчики, а также отправить ответ по этому делу.
Тогда вы можете вернуть обещание из вашей функции, но если это не обработчик маршрута, это не имеет смысла. Вы можете вернуть обещание из функции:
function x() {
return MyFriendes.find({}).exec();
}
и затем используйте это:
x().then(friends => ...).catch(error => ...);
но вы не можете использовать возвращаемые значения, если вы не возвращаете их, вы не можете использовать неопределенные переменные, как если бы они были определены, и вам действительно нужно подумать, кому возвращается ваше возвращаемое значение.
Я предлагаю вам узнать, как на самом деле работает Node, потому что кажется, что вы скопировали и вставили некоторый случайный код, соединили его вместе и ожидаете, что он делает то, что вам нужно, даже не пытаясь понять его.
Чтобы лучше понять асинхронную природу Node, который дает этот порядок выполнения здесь, посмотрите эти ответы:
- Подробное объяснение о том, как использовать обратные вызовы и обещания
- Объяснение того, как использовать обещания в сложных обработчиках запросов
- Объяснение того, что на самом деле является обещанием, на примере запросов AJAX
- Объяснение обратных вызовов, обещаний и способов доступа к данным, возвращаемым асинхронно
Не пытайтесь писать программы Node, пока не поймете концепцию вызовов функций, возвращаемых значений, обратных вызовов и в этом случае обещаний.