以下の関数は、各単語の情報のためにapiを呼び出し、definitions
オブジェクトにデータを保存します。私は、任意のデータを返す前に、サーバーの応答を待つことを約束してきました。javascriptでの解決関数promiseが一貫して動作しない
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);
}
});
}
arr
引数を持つすべての要素は、上記のプログラムが正常に動作WordnikのAPIデータベース内の単語です。しかし、単語が渡されていない場合、プログラムは中断します。私はそれを作って、非単語がなくなるか、 "定義が見つかりません"と表示したいと思います。
解決関数はクリックイベントハンドラを作成し、define
に渡された場合、イベントハンドラがクリックによってトリガされたとき、エラー "Uncaught TypeError:未定義のプロパティ '0'を読み取れません"という行が表示されますコードはobj[this.id][0].text
です。
私はonreadystate
無名関数にこの条件に追加してみました:
if (client[i].responseText[0] === undefined) {
client.responseText[0] = {
word: arr[i],
text: 'Definition not found'
};
が、それは何も解決しません。
ご質問ありがとうございます。何らかの理由で、非単語を渡すと何らかの理由で定義オブジェクトが中断するようです。私はより良い情報で新しい質問をしなければならないと思う。 – Michael
@Michael:デバッガを使って 'this.id'と' obj'の値をチェックしましたか? – Ryan
はい、this.idはうまくいきます。クリックされた要素のIDが表示されます。 Objは "TypeError:未定義(...)のプロパティ 'word'を読み取ることができません" – Michael