Die unten stehende Funktion nimmt eine Reihe von Wörtern ruft eine API für Informationen zu jedem Wort und speichert die Daten in der definitions
Objekt. Ich habe ein Versprechen gegeben, auf eine Serverantwort zu warten, bevor ich irgendwelche Daten zurückgebe.Auflösen Funktion in Javascript Versprechen verhält sich nicht konsequent
function define(arr) { //pyramid of doom at the expense of adding abstraction
return new Promise(function(resolve, reject) {
var client = [];
var definitions = {};
for (var i = 0, len = arr.length; i < len; i++) {
(function(i) {
client[i] = new XMLHttpRequest();
client[i].onreadystatechange = function() {
if (client[i].readyState === 4 && client[i].status === 200) {
definitions[arr[i]] = JSON.parse(client[i].responseText);
if (Object.keys(definitions).length === arr.length) {
resolve(definitions);
}
}
};
client[i].open('GET', 'http://api.wordnik.com:80/v4/word.json/' + arr[i] +
'/definitions?limit=1&includeRelated=false&sourceDictionaries=all&useCanonical=false&includeTags=false&api_key=737061636520696e74656e74696f6e616c6c7920626c616e6',
true);
client[i].send();
})(i);
}
});
}
Wenn jedes Element mit dem arr
Argumente ein Wort in der API-Datenbank Wordnik ist das obige Programm funktioniert gut. Wenn ein Nicht-Wort übergeben wird, bricht das Programm zusammen. Ich möchte es so machen, dass jedes Nicht-Wort entweder weggelassen wird oder "Definition nicht gefunden" anzeigt.
Die Entschlossenheit Funktion einen Klick Eventhandler und wenn ein nicht Wort erzeugt dann zu define
geben wird, wenn der Event-Handler wird durch einen Klick, den Fehler ausgelöst hat „Uncaught Typeerror: kann nicht lesen Eigenschaft‚0‘undefinierter“ erscheint für eine Leitung mit dem Code obj[this.id][0].text
.
habe ich versucht, auf die onreadystate
anonyme Funktion in diesem bedingten Zusatz:
if (client[i].responseText[0] === undefined) {
client.responseText[0] = {
word: arr[i],
text: 'Definition not found'
};
aber nicht alles reparieren.
Dank sind Sie richtig über das Problem, das ich denke, nicht in der Anfrage ist. Aus irgendeinem Grund scheint es, wenn ich ein Nicht-Wort übergebe, dass das Definitionsobjekt irgendwie bricht. Ich denke, ich muss eine neue Frage mit besseren Informationen stellen. – Michael
@Michael: Haben Sie den Wert von 'this.id' und' obj' mit einem Debugger überprüft? – Ryan
Ja this.id funktioniert gut, zeigt die ID des Elements, auf das geklickt wird. Obj zeigt "TypeError: Kann Eigenschaft 'Wort' von undefined (...) nicht lesen" – Michael