2017-10-27 2 views
0

Ich habe ein Problem für den Zugriff auf meine Variable außerhalb der Anfrage-Funktion von cheerios Bibliothek.Access Variable außerhalb Anfrage cheerios Funktion

Hier ist mein Code für ein besseres Verständnis vereinfacht:

var fullDragonInfo = {}; 

dragonsInfo.forEach(dragon => { 

    request(`url=${dragon.name}`, function (error, response, html) { 
     if (!error && response.statusCode == 200) { 

      var $ = cheerio.load(html); 

      $('tr').each(function (i) { 
       let childrenElement = $(this).children('td').children('font'); 

       breedingList.push({ 
        'parent_1': { 
         'name': childrenElement.eq(0).text(), 
         'color': childrenElement.eq(0).attr('color') 
        }, 
        'parent_2': { 
         'name': childrenElement.eq(1).text(), 
         'color': childrenElement.eq(1).attr('color') 
        }, 
        'Tokens': childrenElement.last().text() 
       }); 

      }); 

      Object.assign(fullDragonInfo, { 
       [dragon.name]: { 
        'type': dragon.type, 
        'tier': dragon.tier, 
        'class': dragon.class, 
        'breedable_level': dragon.breedable_level, 
        'breeds_combination': breedingList 
       } 
      }); 
     } 
    }); 
}); 

fs.writeFile("finalData.json", JSON.stringify(fullDragonInfo)); 

So finalData.json meine Ausgabedatei wird ein leeres Objekt zeigt. Aber wenn ich ein Konsolenprotokoll innerhalb der Rückruffunktion mache, sind die Daten hier.

Also ich nehme an, dass das Problem ist, dass ich nicht auf meine Variable außerhalb des Rückrufs zugreifen kann, aber ich habe keine Ahnung, wie ich es tun kann.

Antwort

1

Da die Anfrage asynchron erfolgt, Sie aber Ihre Datei synchron schreiben, wird sie geschrieben, bevor eine Ihrer Anfragen zurückkommt. Sie müssen warten, bis Ihre Anforderungen abgeschlossen sind, bevor Sie die Datei schreiben.

Wenn Sie Versprechungen verwenden können, könnte das besser sein. Aber nur um Ihre Anfragen zu zählen, um Ihren Code beinhalten wird weniger Modifikationen, wie es jetzt ist:

var fullDragonInfo = {}; 
var callbackCount = 0; 

dragonsInfo.forEach(dragon => { 

    callbackCount++; 

    request(`url=${dragon.name}`, function (error, response, html) { 

     callbackCount--; 

     if (!error && response.statusCode == 200) { 

      var $ = cheerio.load(html); 

      $('tr').each(function (i) { 
       let childrenElement = $(this).children('td').children('font'); 

       breedingList.push({ 
        'parent_1': { 
         'name': childrenElement.eq(0).text(), 
         'color': childrenElement.eq(0).attr('color') 
        }, 
        'parent_2': { 
         'name': childrenElement.eq(1).text(), 
         'color': childrenElement.eq(1).attr('color') 
        }, 
        'Tokens': childrenElement.last().text() 
       }); 

      }); 

      Object.assign(fullDragonInfo, { 
       [dragon.name]: { 
        'type': dragon.type, 
        'tier': dragon.tier, 
        'class': dragon.class, 
        'breedable_level': dragon.breedable_level, 
        'breeds_combination': breedingList 
       } 
      }); 
     } 

     if (callbackCount === 0) { 
      fs.writeFile("finalData.json", JSON.stringify(fullDragonInfo)); 
     } 
    }); 
}); 

Durch Zählen Sie jeden bitten Sie machen, und dann eine Zählung jedes Mal entfernen Sie eine Antwort erhalten, werden Sie wissen, dass, wenn die Zählung ist wieder Null, alle Anfragen müssen beendet sein. Am Ende jeder Anfrage prüfen wir, ob es das letzte ist, und wenn es so ist, können Sie Ihre Daten sicher in die Datei schreiben.

Verwandte Themen