2016-11-21 3 views
-1

Я не так хорошо знаком с обещаниями. Мне хотелось бы скрыть обещание-реализацию от обещания.Обещают звонок отдельно от обещания-разрешения

Пример:

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» не определено. Как отделить обещание от обещания?

+0

Не могли бы вы выслать больше кода? Где вы называете 'findFriends' и где вы называете обещание точно? Одна вещь, которую я мог бы рассказать вам о обещаниях - до тех пор, пока вы не называете «то» где-то в своем коде, обещание не будет разрешено. И после разрешения вы можете называть то же 'then' столько раз, сколько хотите, и он будет возвращать те же значения (уже разрешенные). promise Друг, который не определен, не имеет ничего общего с обещанием - это просто означает, что в том месте, где вы называете обещание, эта переменная не определена. – SzybkiSasza

ответ

3

Если вы хотите определить обещание в функции и использовать его где-то в другом месте, прежде всего, вам нужно вернуть обещание от этой функции, чего вы не делаете в своем коде. Затем вам нужно фактически называть эту функцию, которую вы также не выполняете. И, наконец, вам нужно использовать обратный вызов then для возвращаемого значения, которое вы также не делаете в этом случае.

Нет смысла сохранять обещание в локальной переменной promiseFriend, которая относится к этой функции. Также нет смысла возвращать значение в вашем обратном вызове then: .then(function (friends) { return friends; }) - я понятия не имею, что здесь пытались сделать.

Я полагаю, что findFriends должен быть обработчиком маршрута для Экспресса. Если это так, убедитесь, что вы отправляете ответ в каждом случае (который вы не делаете для friends.length===0). Кроме того, вам нужно фактически добавить обработчик then к сохраненному обещанию, если вы хотите действовать, когда он будет разрешен. Прямо сейчас у вас нет даже friends, определенных в вашей функции. Также добавьте обработчики catch, а также отправьте ответ для этого случая.

Тогда вы можете вернуть обещание от своей функции, но нет, если это обработчик маршрута, это не имеет смысла. Вы можете вернуть обещание от функции:

function x() { 
    return MyFriendes.find({}).exec(); 
} 

, а затем использовать его:

x().then(friends => ...).catch(error => ...); 

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

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

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

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

+0

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

Смежные вопросы