Обещание позвонить отдельно от обещания-разрешения

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

Пример:

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, который дает этот порядок выполнения здесь, посмотрите эти ответы:

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

Другие вопросы по тегам