Xavi Font
Xavi Font

Reputation: 564

Promise ignoring simple syncronous operation

In a promise, I want to assign a value to the property of several objects created from a class (in a loop), but when executing the function and doing the .then(() => console.log(r)) thing, the r does was not modified to what the promise promised me it would.

Here:

function assignSentenceImageDescription () {
    return new Promise((resolve, reject) =>
    {
        assigningWordsPartOFSpeech().then((r) => {

                JSON.parse(r).sentences.forEach((sentence) => {
                        let adjectiveBeforeNoun = [];
                        let sentenceImageDescription = [];
                        sentence.words.forEach((wordInSentence) => {
                            try {
                                if (wordInSentence.partOfSpeech[0].wordtype === "n.") {
                                    let imageDescription = adjectiveBeforeNoun.join('') + wordInSentence.partOfSpeech[0].word;
                                    sentenceImageDescription.push(imageDescription)
                                    adjectiveBeforeNoun = [];
                                } else if (wordInSentence.partOfSpeech[0].wordtype === "superl.") {
                                    adjectiveBeforeNoun.push(wordInSentence.partOfSpeech[0].word + " ")
                                }
                            } catch (e) {
                                console.log("===NOT IN DICTIONARY===")
                            }
                        })
                        sentence.imageDescription = sentenceImageDescription;
                    }
                )
                resolve(r);
            }
        );
    }
    );
}

On the line

sentence.imageDescription = sentenceImageDescription;

I try to assign the image description of each of the sentences iterated over, but when I do

assignSentenceImageDescription().then(r => console.log(r));

the r object still does not have each of its sentences's imageDescription property modified to the value the array sentenceImageDescription has, which is what the assignSentenceImageDescription() function is intended to do.

Upvotes: 0

Views: 67

Answers (1)

Bravo
Bravo

Reputation: 6264

Refactor your code as follows:

Note: you don't need a Promise constructor since assigningWordsPartOFSpeech returns a Promise that you can work with (and return)

Set sentences = JSON.parse(r).sentences;

Now you can iterate through sentences as you already do, then simply return sentences in the .then - and you're done

function assignSentenceImageDescription() {
    return assigningWordsPartOFSpeech().then((r) => {
        const data = JSON.parse(r);
        data.sentences.forEach((sentence) => {
            let adjectiveBeforeNoun = [];
            let sentenceImageDescription = [];
            sentence.words.forEach((wordInSentence) => {
                try {
                    if (wordInSentence.partOfSpeech[0].wordtype === "n.") {
                        let imageDescription = adjectiveBeforeNoun.join('') + wordInSentence.partOfSpeech[0].word;
                        sentenceImageDescription.push(imageDescription)
                        adjectiveBeforeNoun = [];
                    } else if (wordInSentence.partOfSpeech[0].wordtype === "superl.") {
                        adjectiveBeforeNoun.push(wordInSentence.partOfSpeech[0].word + " ")
                    }
                } catch (e) {
                    console.log("===NOT IN DICTIONARY===")
                }
            })
            sentence.imageDescription = sentenceImageDescription;
        });
        return data;
    });
}

Upvotes: 1

Related Questions