2015-04-02 53 views
3

如果我沒有正確使用.spread藍鳥承諾在Sails.js模式工作時,我不知道。下面是我有:藍鳥諾傳播方法返回類型錯誤

transactionAsync('BEGIN') 
.then(function() { 
    return Model.findOne({ id: 5) }); 
}) 
.then(function(results){ 
    if(!results) { 
     return res.notFound(); 
    } 
    crypto.randomBytes(24, function(err, buf) { 
     if(err) throw new Error(err); 
     var token = buf.toString('hex'); 
     // This is where it fails 
     return [results, token]; 
    }); 
}) 
.spread(function(results, token) { 
    // It doesn't get to log these 
    console.log(results, token); 
    ... 
}) 
... 

第二.then返回[results, token](該密碼回調的內部)後,吐出

[TypeError: expecting an array, a promise or a thenable] 

我刪除了代碼的其餘部分.spread後,因爲它不是真正相關的,這就是執行停止之前返回一個錯誤。

我只想resultstoken傳遞變量的.spread裏面的功能。我究竟做錯了什麼?

任何幫助都很好。謝謝。

+0

你確定你停止執行.spread()? – 2015-04-03 00:40:13

+0

是的,它不會執行'.spread()'內部的代碼,並且我確信在返回之前,密碼中的任何內容都會實際運行。我猜,也許我不應該把異步代碼像crypto.randomBytes放在promise中?或者也許只是讓crypto.randomBytes成爲承諾鏈的一部分。 – Lester 2015-04-03 00:44:46

+0

只需放置一些console.log()並跟蹤執行停止的位置?這裏你的錯誤是指示任何then()函數或者spread()都沒有得到預期的參數,所以可能會有一些地方你的流程返回爲未定義的。 – 2015-04-03 00:58:37

回答

1
.then(function(results){ 
    if(!results) { 
     return res.notFound(); 
    } 
    crypto.randomBytes(24, function(err, buf) { 
     if(err) throw new Error(err); 
     var token = buf.toString('hex'); 
     // This is where it fails 
     return [results, token]; 
    }); 
}) 

是錯誤的。你是return int從randomBytes內部回調,而不是then裏面,所以你的then只是簡單地返回undefined然後你試着.spread那個。爲了正確地等待randomBytes,您需要爲該值創建一個承諾。

.then(function(results){ 
    if(!results) { 
     return res.notFound(); 
    } 

    return new Promise(function(resolve, reject){ 
     crypto.randomBytes(24, function(err, buf) { 
      if(err) return reject(new Error(err)); 
      var token = buf.toString('hex'); 
      // This is where it fails 
      resolve([results, token]); 
     }); 
    }); 
}) 
2

第二.then

這不是你在做什麼返回[results, token]後。你在加密回調中返回,它沒有意義。任何人都不知道這個回調,也不知道then回調

承諾開發的first rule是底層API的promisify,以便您可以處理純承諾。

var crypto = Promise.promisifyAll(crypto); 
// or specifically: 
var randomBytes = Promise.promisify(crypto.randomBytes); 

現在我們可以遵循的規則3b和實際上從那時then回調返回(承諾)結果:

… 
.then(function(results) { 
    if (!results) { 
     return res.notFound(); 
    } 
    return crypto.randomBytesAsync(24) // returns a promise now! 
// ^^^^^^ 
    .then(function(buf) { 
     var token = buf.toString('hex'); 
     return [results, token]; 
    }); 
}) 
.spread(function(results, token) { 
    console.log(results, token); 
    … 
})