2015-04-02 55 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); 
    … 
})