Обещать вызов отдельно от обещания

Я не знаком с promises. Я бы хотел скрыть обещание-реализацию от обещания.

Пример:

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

Теперь, я понимаю, что "promFriend" - undefined. Как я могу отделить обещание от обещания?

Ответ 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 => ...);

но вы не можете использовать возвращаемые значения, если вы не возвращаете его, вы не можете использовать переменные undefined, как если бы они были определены, и вам действительно нужно рассмотреть, каково ваше возвращаемое значение.

Я предлагаю вам узнать, как работает Node, потому что кажется, что вы скопировали и вставили какой-то случайный код, объединили его и ожидали, что он сделает то, что вы хотите, даже не пытаясь понять его.

Чтобы лучше понять асинхронный характер Node, который дает этот порядок выполнения здесь, см. ответы:

Не пытайтесь писать программы Node, прежде чем понимать концепцию вызовов функций, возвращаемых значений, обратных вызовов и в этом случае promises.