bluebird从3.x最先对promise的毛病运用会有以下三种Warning,提示你正在不正确运用bluebird,下面临这三种warning举行诠释,并申明怎样防止。
Warning: .then() only accepts functions
Warning: a promise was rejected with a non-error
Warning: a promise was created in a handler but none were returned from it
Warning: .then() only accepts functions
Warning: .then要领只接收function作为参数
假如你看到如许的提示,申明你的代码运转效果不符合你的预期。最主要原因是传个.then()
的参数是一个函数的实行效果,而不是函数自身。
function processImage(image) {
// Code that processes image
}
getImage().then(processImage());
上面的要领就是挪用processImage()
然后马上将返回效果传给.then()
.这里传给.then()
的参数就是undefined
。
为处置惩罚这个题目,只要给.then()
传函数就能够了,就像如许:
getImage().then(processImage)
假如你有疑问为何这里不直接简朴粗犷地抛出TypeError,而是一个warning。因为Promises/A+规范划定看待毛病运用时不予理睬。
Warning: a promise was rejected with a non-error
Warning: 一个promise谢绝时抛出了一个非Error值
因为JavaScript的汗青毛病,throw
能够抛出任何范例的值。Promises/A+挑选继续相沿这个毛病,所以promise是能够抛出一个非Error范例的值。
一个毛病是一个继续于Error的对象。它最少须要有.stack
和.message
属性。因为毛病一般会被依据它的差别泉源而被分红差别品级,所以一个毛病须要包括充足的信息,以让高等别的handler具有充足的信息来天生一份有效的高等的毛病报告。
因为一切的对象都支撑具有属性,你能够还会有疑问说,为何肯定如果一个Error对象而不能是一个一般的对象。一个毛病对象除了要有这些属性,另有一个一样主要的特征就是自动收集stack trace。有了stack trace你才轻易的找到毛病的泉源。
你最好处置惩罚下这些warning,因为一个被谢绝的promise返回一个非Error,会致使调试异常困难而且高本钱。别的假如你谢绝一个promise只是运用最大略的挪用reject()
,如许你就没办法处置惩罚毛病了,而且你只能通知用户“有处所出错了”。
Warning: a promise was created in a handler but none were returned from it
Warning: 你创建了一个没有返回效果的promise
这一般申明你只是单单地遗忘了声明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 设置