Add async function detection to _.isFunction.

This commit is contained in:
John-David Dalton
2016-10-27 10:05:22 -07:00
parent a9fd17950a
commit 7d4c3ed404
2 changed files with 20 additions and 6 deletions

View File

@@ -86,6 +86,7 @@
/** `Object#toString` result references. */ /** `Object#toString` result references. */
var argsTag = '[object Arguments]', var argsTag = '[object Arguments]',
arrayTag = '[object Array]', arrayTag = '[object Array]',
asyncTag = '[object AsyncFunction]',
boolTag = '[object Boolean]', boolTag = '[object Boolean]',
dateTag = '[object Date]', dateTag = '[object Date]',
domExcTag = '[object DOMException]', domExcTag = '[object DOMException]',
@@ -11627,7 +11628,7 @@
// The use of `Object#toString` avoids issues with the `typeof` operator // The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 9 which returns 'object' for typed arrays and other constructors. // in Safari 9 which returns 'object' for typed arrays and other constructors.
var tag = baseGetTag(value); var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == proxyTag; return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
} }
/** /**

View File

@@ -364,8 +364,13 @@
return /^(?:\$\$cov_\d+\$\$)$/.test(key); return /^(?:\$\$cov_\d+\$\$)$/.test(key);
})]; })];
/** Used to test async functions. */
var asyncFunc = lodashStable.attempt(function() {
return Function('return async () => {}');
});
/** Used to test generator functions. */ /** Used to test generator functions. */
var generator = lodashStable.attempt(function() { var genFunc = lodashStable.attempt(function() {
return Function('return function*(){}'); return Function('return function*(){}');
}); });
@@ -2717,7 +2722,8 @@
var uncloneable = { var uncloneable = {
'DOM elements': body, 'DOM elements': body,
'functions': Foo, 'functions': Foo,
'generators': generator 'async functions': asyncFunc,
'generator functions': genFunc
}; };
lodashStable.each(errors, function(error) { lodashStable.each(errors, function(error) {
@@ -9033,7 +9039,7 @@
}); });
QUnit.test('should return `false` for non-arrays', function(assert) { QUnit.test('should return `false` for non-arrays', function(assert) {
assert.expect(11); assert.expect(12);
var expected = lodashStable.map(falsey, function(value) { var expected = lodashStable.map(falsey, function(value) {
return value === ''; return value === '';
@@ -9049,7 +9055,8 @@
assert.strictEqual(_.isArrayLike(new Date), false); assert.strictEqual(_.isArrayLike(new Date), false);
assert.strictEqual(_.isArrayLike(new Error), false); assert.strictEqual(_.isArrayLike(new Error), false);
assert.strictEqual(_.isArrayLike(_), false); assert.strictEqual(_.isArrayLike(_), false);
assert.strictEqual(_.isArrayLike(generator), false); assert.strictEqual(_.isArrayLike(asyncFunc), false);
assert.strictEqual(_.isArrayLike(genFunc), false);
assert.strictEqual(_.isArrayLike(slice), false); assert.strictEqual(_.isArrayLike(slice), false);
assert.strictEqual(_.isArrayLike({ 'a': 1 }), false); assert.strictEqual(_.isArrayLike({ 'a': 1 }), false);
assert.strictEqual(_.isArrayLike(1), false); assert.strictEqual(_.isArrayLike(1), false);
@@ -10519,10 +10526,16 @@
assert.strictEqual(_.isFunction(slice), true); assert.strictEqual(_.isFunction(slice), true);
}); });
QUnit.test('should return `true` for async functions', function(assert) {
assert.expect(1);
assert.strictEqual(_.isFunction(asyncFunc), typeof asyncFunc == 'function');
});
QUnit.test('should return `true` for generator functions', function(assert) { QUnit.test('should return `true` for generator functions', function(assert) {
assert.expect(1); assert.expect(1);
assert.strictEqual(_.isFunction(generator), typeof generator == 'function'); assert.strictEqual(_.isFunction(genFunc), typeof genFunc == 'function');
}); });
QUnit.test('should return `true` for the `Proxy` constructor', function(assert) { QUnit.test('should return `true` for the `Proxy` constructor', function(assert) {