2017-10-28 4 views
2

Ich versuche localForage Unterstützung des pure-form Web Component hinzufügen, indem Sie eine globale Instanz von localForage erstellen:Gibt es eine Möglichkeit zu überprüfen, ob eine JavaScript-Funktion einen Rückruf akzeptiert?

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

Und es zu einer Instanz von reiner Form über das storage Attribut zuweisen:

<pure-form src="path-to-schema.json" storage="appStorage"></pure-form> 

Intern führt pure-form window[self.storage] aus, um eine Kennung für das Speicherobjekt abzurufen, und verwendet .getItem, .setItem, um Werte synchron festzulegen und abzurufen.

Problem ist localForage ist asynchron, dh .getItem, .setItem erwarten, Werte über einen Rückruf zurückgeben. Daher meine aktuelle Logik wird nicht funktionieren:

// get value from web storage 
var storedContent = window[self.storage].getItem('item-key'); 

Ich weiß, ich könnte den Anruf in einem Versprechen wickeln, aber wie es rein Form steht nicht Versprechungen erfordern und ich würde es hassen, diese Abhängigkeit nur für diesen hinzufügen .

Was würde ich tun zu überprüfen, ob .getItem oder .setItem einen Rückruf benötigen, und wenn ja, ändern Sie den Code entsprechend ...

+2

Sie überprüfen Die Dokumentation - es gibt keine Möglichkeit, dies zu erkennen, ohne die Quelle oder die Dokumentation zu betrachten. Das heißt, fast jeder asynchrone Anruf nimmt entweder einen Rückruf oder nutzt Versprechungen. –

+0

Also, ich denke, die Alternative wäre, zu versuchen, festzustellen, ob der Speicher eine Instanz von localForage ist? Problem ist, das wird ein hart codierter Randfall –

+0

Sie könnten prüfen, '.getItem.length' ist mehr als 1. Es gibt keine Garantie, dass der zusätzliche Parameter in der Funktionsdeklaration erscheint, aber wenn es tut, wird es mindestens 2 sein. – trincot

Antwort

3

Wie @ Dave-Newton wies darauf hin, in den Kommentaren:

gibt es keine Möglichkeit zu sagen, ohne auf die Quelle oder die Dokumente zu schauen. Das heißt, fast jeder asynchrone Anruf nimmt entweder einen Rückruf oder nutzt Versprechungen.

Auf dieser Grundlage habe ich zwei Funktionen, die wrap .getItem Anrufe und .setItem und prüft ihre Antworten. Wenn sie eine Instanz von Versprechen zurückkehren, löst er .then mit - sonst den Rückruf als normal ausführt:

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

Was bedeutet, kann ich jetzt tun:

// get value from web storage 
getStorageItem(webStorage, key, function(value) { 

    if (value) { 
     // whatever I want with the value 
    } 
}); 

Implementierung here

Verwandte Themen