有没有办法检查 JavaScript 函数是否接受回调?
Is there a way to check if a JavaScript function accepts a callback?
我正在尝试通过创建 localForage 的全局实例来添加 localForage support to the pure-form Web 组件:
// create a global appStorage object that mimics localStorage API (greater storage)
window.appStorage = localforage.createInstance({
driver: [
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
],
name: 'product-name',
version: 1.0,
storeName: 'app'
});
并通过 storage
属性将其分配给纯形式的实例:
<pure-form src="path-to-schema.json" storage="appStorage"></pure-form>
在内部,纯形式执行 window[self.storage]
以获取存储对象的句柄,并使用 .getItem
、.setItem
同步设置和检索值。
问题是 localForage 是异步的,这意味着 .getItem
、.setItem
期望通过回调获得 return 值。因此,我当前的逻辑将不起作用:
// get value from web storage
var storedContent = window[self.storage].getItem('item-key');
我知道我可以将调用包装在 Promise 中,但就目前而言,纯形式不需要 promise,我不想为此添加依赖项。
我想做的是检查 .getItem
或 .setItem
是否需要回调,如果需要,相应地修改代码...
正如@Dave-Newton 在评论中指出的那样:
there's no way to tell without looking at the source or docs. That said, almost any async call either takes a callback or uses promises.
基于此,我创建了两个函数来包装对 .getItem
和 .setItem
的调用并检查它们的响应。如果他们 return Promise 的实例,它使用 .then
解析 - 否则正常执行回调:
/**
* Get a value from web storage regardless of whether it's sync or async
*/
function getStorageItem(storage, key, callback) {
if (typeof callback !== 'function') throw new Error('Invalid callback handler');
var result = storage.getItem(key);
if (result instanceof window.Promise) {
result.then(callback);
}
else {
callback(result);
}
}
/**
* Set a value in web storage regardless of whether it's sync or async
*/
function setStorageItem(storage, key, value, callback) {
var result = storage.setItem(key, value);
if (result instanceof window.Promise && callback) {
result.then(callback);
}
else if (callback) {
callback();
}
}
这意味着我现在可以做:
// get value from web storage
getStorageItem(webStorage, key, function(value) {
if (value) {
// whatever I want with the value
}
});
实施here
我正在尝试通过创建 localForage 的全局实例来添加 localForage support to the pure-form Web 组件:
// create a global appStorage object that mimics localStorage API (greater storage)
window.appStorage = localforage.createInstance({
driver: [
localforage.INDEXEDDB,
localforage.WEBSQL,
localforage.LOCALSTORAGE
],
name: 'product-name',
version: 1.0,
storeName: 'app'
});
并通过 storage
属性将其分配给纯形式的实例:
<pure-form src="path-to-schema.json" storage="appStorage"></pure-form>
在内部,纯形式执行 window[self.storage]
以获取存储对象的句柄,并使用 .getItem
、.setItem
同步设置和检索值。
问题是 localForage 是异步的,这意味着 .getItem
、.setItem
期望通过回调获得 return 值。因此,我当前的逻辑将不起作用:
// get value from web storage
var storedContent = window[self.storage].getItem('item-key');
我知道我可以将调用包装在 Promise 中,但就目前而言,纯形式不需要 promise,我不想为此添加依赖项。
我想做的是检查 .getItem
或 .setItem
是否需要回调,如果需要,相应地修改代码...
正如@Dave-Newton 在评论中指出的那样:
there's no way to tell without looking at the source or docs. That said, almost any async call either takes a callback or uses promises.
基于此,我创建了两个函数来包装对 .getItem
和 .setItem
的调用并检查它们的响应。如果他们 return Promise 的实例,它使用 .then
解析 - 否则正常执行回调:
/**
* Get a value from web storage regardless of whether it's sync or async
*/
function getStorageItem(storage, key, callback) {
if (typeof callback !== 'function') throw new Error('Invalid callback handler');
var result = storage.getItem(key);
if (result instanceof window.Promise) {
result.then(callback);
}
else {
callback(result);
}
}
/**
* Set a value in web storage regardless of whether it's sync or async
*/
function setStorageItem(storage, key, value, callback) {
var result = storage.setItem(key, value);
if (result instanceof window.Promise && callback) {
result.then(callback);
}
else if (callback) {
callback();
}
}
这意味着我现在可以做:
// get value from web storage
getStorageItem(webStorage, key, function(value) {
if (value) {
// whatever I want with the value
}
});
实施here