Bluebird .then():未定义函数引用时没有 TypeError
Bluebird .then(): no TypeError when function reference is undefined
我最近开始使用 promises 并发现了一个奇怪的行为。
当我给 .then() 函数一个未定义函数的引用时,它会被跳过,然后调用下一个 then。
一个例子:
var cust = customer({general: { cust_id: 22 }}); // just for testing
req.pool.getConnectionAsync()
.then(cust.del) // cust.del is 'undefined'
.then(function(dbResult) { console.log("dbresult:"); console.log(dbResult); res.status(200).end(); })
.catch(function (e) { console.log(e); res.status(500).end(); });
所以这里发生了什么:
- getConnectionAsync returns 应该给 cust.del
的连接
- cust.del 未定义(我打错了,正确的函数应该是 cust.delete)
- 没有引发错误,而是使用来自 getConnectionAsync 的连接调用下一个 .then 函数作为 "dbresult"
- 最后一个 then 函数的输出是连接对象而不是数据库结果对象,状态 200 返回给客户端
如果我将代码更改为:
req.pool.getConnectionAsync()
.then(function(conn) { cust.del(conn) }) // type error is raised
.then(function(dbResult) { console.log("dbresult:"); console.log(dbResult); res.status(200).end(); })
.catch(function (e) { console.log(e); res.status(500).end(); });
然后我得到了预期的 TypeError 并调用了 catch 函数。
这是预期的行为吗?或者我错过了什么来防止这种情况发生?
.then(cust.del) 显然是更简洁的代码,但由于此函数不可调用,因此应该有一个错误。
问候
菲尔
正如评论所说,这类似于:
Promise.resolve().then(undefined); // undefined is ignored here
它在 Promises/A+ 规范中指定,并且在每个 promise 实现中都以这种方式工作。理由是 Promises/A+ 不必支持 .catch
方法,你可以这样做:
Promise.reject().then(null, function(err){ /* handle */ });
以及与现有库的互操作性。
我最近开始使用 promises 并发现了一个奇怪的行为。 当我给 .then() 函数一个未定义函数的引用时,它会被跳过,然后调用下一个 then。
一个例子:
var cust = customer({general: { cust_id: 22 }}); // just for testing
req.pool.getConnectionAsync()
.then(cust.del) // cust.del is 'undefined'
.then(function(dbResult) { console.log("dbresult:"); console.log(dbResult); res.status(200).end(); })
.catch(function (e) { console.log(e); res.status(500).end(); });
所以这里发生了什么:
- getConnectionAsync returns 应该给 cust.del 的连接
- cust.del 未定义(我打错了,正确的函数应该是 cust.delete)
- 没有引发错误,而是使用来自 getConnectionAsync 的连接调用下一个 .then 函数作为 "dbresult"
- 最后一个 then 函数的输出是连接对象而不是数据库结果对象,状态 200 返回给客户端
如果我将代码更改为:
req.pool.getConnectionAsync()
.then(function(conn) { cust.del(conn) }) // type error is raised
.then(function(dbResult) { console.log("dbresult:"); console.log(dbResult); res.status(200).end(); })
.catch(function (e) { console.log(e); res.status(500).end(); });
然后我得到了预期的 TypeError 并调用了 catch 函数。
这是预期的行为吗?或者我错过了什么来防止这种情况发生? .then(cust.del) 显然是更简洁的代码,但由于此函数不可调用,因此应该有一个错误。
问候 菲尔
正如评论所说,这类似于:
Promise.resolve().then(undefined); // undefined is ignored here
它在 Promises/A+ 规范中指定,并且在每个 promise 实现中都以这种方式工作。理由是 Promises/A+ 不必支持 .catch
方法,你可以这样做:
Promise.reject().then(null, function(err){ /* handle */ });
以及与现有库的互操作性。