2017-10-27 5 views
0

私はcheerioのライブラリのリクエスト機能の外で自分の変数にアクセスする際に問題に直面しています。ここでリクエスト変数の外で変数にアクセスする

はより良く理解するために簡略化私のコードです:

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)); 

だから私の出力ファイルfinalData.jsonは空のオブジェクトを示しています。しかし、コールバック関数内でコンソールログを実行すると、データはここにあります。

私は、コールバック以外の変数にアクセスできないという問題があると想定していますが、私はどのようにして行うことができないのか分かりません。

答えて

1

リクエストは非同期に発生しますが、ファイルを同期して書き込むため、要求が返される前に書き込まれています。ファイルを書き込む前に、リクエストが完了するのを待つ必要があります。

約束を使うことができれば、それが良いかもしれません。しかし、それは今のようにちょうどあなたの要求をカウントすると、あなたのコードに以下の変更を伴います:

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

それぞれがあなたが作る要求カウントアップし、その後、カウントあなたが応答を取得するたびに除去することにより、あなたがもしことを知っているだろうカウントが再びゼロになり、すべての要求が完了していなければなりません。だから、各リクエストの終わりに、それが最後のものかどうかをチェックし、もしそうなら、データをファイルに書き込むことは安全です。

関連する問題