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(); });

所以这里发生了什么:

如果我将代码更改为:

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 */ });

以及与现有库的互操作性。