diff --git a/lib/init.lua b/lib/init.lua index 6687e66..9d3b0fa 100644 --- a/lib/init.lua +++ b/lib/init.lua @@ -471,11 +471,20 @@ function Promise.is(object) return false end - local ok, isPromise = pcall(function() - return type(object.andThen) == "function" - end) + local objectMetatable = getmetatable(object) - return ok and isPromise + if objectMetatable == Promise then + -- The Promise came from this library. + return true + elseif objectMetatable == nil then + -- No metatable, but we should still chain onto tables with andThen methods + return type(object.andThen) == "function" + elseif type(objectMetatable) == "table" and type(rawget(objectMetatable, "andThen")) == "function" then + -- Maybe this came from a different or older Promise library. + return true + end + + return false end --[[