Недавно я начал работать с обещаниями и нашел для меня странное поведение. Когда я передаю функцию .then() ссылку на неопределенную функцию, она просто пропущена, а затем вызывается.Bluebird .then(): no TypeError, когда ссылка на функцию не определена
Пример:
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 возвращает соединение, которое должно быть дано в cust.del
- cust.del не определено (опечатка по мне правильная функция будет cust.delete)
- ошибка не возникает вместо следующей функции. then вызывается с соединением getConnectionAsync как «dbresu л»
- выход последнего затем функции является объект подключения, а не результат дб объекта и состояние 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), очевидно, намного более чистый код, но поскольку эта функция не вызываема, должна быть ошибка.
С уважением Фил
Ожидаемое поведение: [Обещание/A +: 2.2 Тогда метод] (https://promisesaplus.com/#point-23): '[...] 2.2.1 Оба onFulfilled и onRejected являются необязательными аргументами , 2.2.1.1 Если onFulfilled не является функцией, его следует игнорировать., 2.2.1.2 Если onRejected не является функцией, его следует игнорировать. [...] ' –
Большое спасибо. Я пропустил это полностью, когда прочитал это ... моя вина. – Phil147