2016-07-26 3 views
0

В документации петлевой, он говорит «Следующие встроенные модели поддерживают обещание API: пользователя Применения PersistedModel»Петлевого API, и обещают

Так что, если в модульном тесте, я хочу, чтобы создать пользователь, а затем войти в этот пользователь, то как же с помощью метода обратного вызова работает:

aUser.create({email: '[email protected]', password: 'foo'}, function() { 
       aUser.login({email: '[email protected]', password: 'foo'}, 'user', function (err, res) { 
        // stuff 
       }); 
      }); 

но используя обещания не:

var Promise = require ('bluebird'); 
aUser.create({email: '[email protected]', password: 'bar'}) 
       .then(function(err, res){ 
        aUser.login({email: '[email protected]', password: 'bar'}, 'user'); 
       }) 
       .then(function(err, res) { 
        //stuff 
       }) 
       .catch(function(err){ 
        console.error(err); 
       }); 

Я также пробовал Promise.join, Promise.mapSeries.

+0

«не работает» как? –

ответ

0

два вопрос:

  1. Вашего Обещание коды не делать то же самое, что ваш код не-обещаний. В вашем коде обезвреживания вы не делаете «вещи» до тех пор, пока aUser.login не завершится успешно, но в вашем коде обещаний вы этого не ожидаете. Чтобы сделать то же самое, ваш первый then обратный вызов должен вернуть обещание, что aUser.login возвращается. В противном случае обещание, которое ваш первый вызов then возвращает, разрешается с помощью значения undefined, а не оседает на основе разрешения или отклонения обещания aUser.login.

  2. В вы декларирование для then обратных вызовов аргументов неверны: разрешение обратного вызова получает единственный аргумент, который является разрешенным значением. Это не похоже на обратный вызов NodeJS, который получает два.

Так (см линии с тэгом ***):

var Promise = require ('bluebird'); 
aUser.create({email: '[email protected]', password: 'bar'}) 
    .then(function(res){              // *** 
     return aUser.login({email: '[email protected]', password: 'bar'}, 'user'); // *** 
    }) 
    .then(function(res){              // *** 
     //stuff 
    }) 
    .catch(function(err){ 
     console.error(err); 
    }); 

Side Примечание: Если вы не используете Promise в вашем коде, нет необходимости требовать его.

+0

Спасибо за ответ - извинения, пара опечаток в примере Promise с учетом аргументов, но я ценю обратную связь – stephenwil

+0

@stephenwil: Не стоит беспокоиться. Первый пункт выше, вероятно, что не так. –

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