bluebird从3.x开始对promise的错误使用会有如下三种Warning,提醒你正在不正确使用bluebird,下面对这三种warning进行解释,并说明如何避免。html
Warning: .then() only accepts functionssegmentfault
Warning: a promise was rejected with a non-errorpromise
Warning: a promise was created in a handler but none were returned from it函数
若是你看到这样的提醒,说明你的代码运行结果不符合你的预期。最主要缘由是传个.then()
的参数是一个函数的执行结果,而不是函数自己。调试
function processImage(image) { // Code that processes image } getImage().then(processImage());
上面的方法就是调用processImage()
而后马上将返回结果传给.then()
.这里传给.then()
的参数就是undefined
。
为解决这个问题,只要给.then()
传函数就能够了,就像这样:code
getImage().then(processImage)
若是你有疑问为何这里不直接简单粗暴地抛出TypeError,而是一个warning。由于Promises/A+标准规定对待错误使用时不予理睬。htm
因为JavaScript的历史错误,throw
能够抛出任何类型的值。Promises/A+选择继续沿用这个错误,因此promise是能够抛出一个非Error类型的值。对象
一个错误是一个继承于Error的对象。它至少须要有.stack
和.message
属性。由于错误一般会被根据它的不一样来源而被分红不一样等级,因此一个错误须要包含足够的信息,以让高级别的handler拥有足够的信息来生成一份有用的高级的错误报告。继承
由于全部的对象都支持拥有属性,你可能还会有疑问说,为何必定要是一个Error对象而不能是一个普通的对象。一个错误对象除了要有这些属性,还有一个一样重要的特性就是自动采集stack trace。有了stack trace你才能容易的找到错误的来源。ip
你最好处理下这些warning,由于一个被拒绝的promise返回一个非Error,会致使调试很是艰难而且高成本。另外若是你拒绝一个promise只是使用最简陋的调用reject()
,这样你就没办法处理错误了,并且你只能告诉用户“有地方出错了”。
这一般说明你只是单单地忘记了声明return
,但却致使了该promise丢失,从而没法关联到promise链中。
例如:
getUser().then(function(user) { getUserData(user); }).then(function(userData) { // userData is undefined });
由于在第一个then里面,getUserData(user)
没有做为结果return,致使第二个then认为userData=undefined
并当即执行(由于没有声明return默认返回undefined
)。
解决这个问题,你只须要return这个promise:
getUser().then(function(user) { return getUserData(user); }).then(function(userData) { // userData is the user's data });
若是你知道你在作什么,而且不想看到warning,你只须要随便返回点什么,好比null
:
getUser().then(function(user) { // 后台执行,不在意运行结果 saveAnalytics(user); // 返回一个非`undefined`的值,表示咱们并无忘记return return null; });
原文连接:http://bluebirdjs.com/docs/warning-explanations.html
推荐阅读:Bluebird promise 设置