2016-07-26 83 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); 
    }); 

附註:如果你不是在你的代碼中使用Promise,沒有必要要求它。

+0

感謝您的答覆 - 道歉,在承諾的例子中的幾個錯誤的論點,但我讚賞反饋 – stephenwil

+0

@stephenwil:無後顧之憂。上面的第一項可能是錯誤的。 –