资讯专栏INFORMATION COLUMN

Bluebird warning 解释说明[译]

whjin / 706人阅读

摘要:从开始对的错误使用会有以下三种,提醒你正在不正确使用,下面对这三种进行解释,并说明如何避免。因为标准规定对待错误使用时不予理睬。一个错误是一个继承于的对象。例如因为在第一个里面,没有作为结果,导致第二个认为并立即执行因为没有声明默认返回。

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 设置

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86270.html

相关文章

  • Bluebird promise 设置

    摘要:可设置长堆栈跟踪警告监控和取消。注意虽然这里默认值都是,但是在开发环境下自动会开启堆栈跟踪和警告。你可以对单独设置检查忘记声明的警告开启所有警告除了检查是警告属性中唯一一个可以单独拆分设置的属性。 Promise.config(Object { warnings: boolean=false, longStackTraces: boolean=false, ca...

    bluesky 评论0 收藏0
  • [] 深入理解 Promise 五部曲:4. 扩展问题

    摘要:有一个和相关的更大的问题。最后,请负有责任感并且使用安全的扩展。深入理解五部曲异步问题深入理解五部曲转换问题深入理解五部曲可靠性问题深入理解五部曲扩展性问题深入理解五部曲乐高问题最后,安利下我的个人博客,欢迎访问 原文地址:http://blog.getify.com/promis... 现在,我希望你已经看过深入理解Promise的前三篇文章了。并且假设你已经完全理解Promises...

    Shimmer 评论0 收藏0
  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0
  • [] 理解 PHP 内部函数的定义(给PHP开发者的PHP源码-第二部分)

    摘要:文章来自原文欢迎来到给开发者的源码系列的第二部分。是在内部代表任意一个变量的定义。这种情况下函数会抛出警告,而此函数马上返回会返回给的用户层代码。原因是,是少数通过而不是扩展定义的函数。下一部分下一部分会再次发表在。 文章来自:http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitio...

    hizengzeng 评论0 收藏0
  • 实现一个符合标准的Promise

    摘要:不同的的实现需要可以相互调用,搞清楚了标准之后,开始动手吧构造函数产生一个对象有很多种方法,构造函数是看起来最面向对象的一种,而且原生实现也是使用的构造函数,因此我也决定使用构造函数的方法。 -- What i cant create, i dont understant 前言 实现Promise的目的是为了深入的理解Promies,以在项目中游刃有余的使用它。完整的代码见gitHub...

    yuanzhanghu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<