2016-09-21 19 views
0

私はこのコードを手に入れることができます。しかし、ノードがグローバル変数にデータを渡すのが好きではないので、それは汚れていると感じていました。これを書き込む方がいいですか?私はノードにはとても新しいので、私の人生をはるかに簡単にしてくれるはずの作品がないように感じます。 @ JordanHendrix提案に従って、私はテンプレートリテラルに移ります。私の解決策は "醜い"と思われます

var wikipedia = require("node-wikipedia"); 
var infobox = require('wiki-infobox'); 
var Promise = require('es6-promise').Promise; 

var fs = require('fs'); 

String.prototype.format = function() 
{ 
    var content = this; 
    for (var i=0; i < arguments.length; i++) 
    { 
     var replacement = '{' + i + '}'; 
     content = content.replace(replacement, arguments[i]); 
    } 
    return content; 
}; 


function getLinks() { 
    return new Promise(function(resolve, reject) { 
    wikipedia.page.data("List_of_hip_hop_musicians", { content: true }, function(response) { 
     fs.writeFile("response.json", JSON.stringify(response, null, 2), function(err) { 
     if(err) { 
      return console.log(err); 
     } 
     }); 
     resolve(response.links); 
    }); 
    }); 
} 


function getInfo(links){ 
    return new Promise(function(resolve, reject) { 
    fs.appendFile("info.csv", "name, background, birth_name, birth_date, birth_place, origin, genre, occupation, instrument, years_active, label, website\n", function(err) { 
     if(err) { 
     return console.log(err); 
     } 
    }); 
    for (i=0; i<10; i++) { 
     var link = links[i]['*']; 
     resolveInfo(link).then(function(newText){ 
     fs.appendFile("info.csv", newText, function(err) { 
      if(err) { 
      return console.log(err); 
      } 
     }); 
     }); 
    } 
    resolve(text) 
    }); 
} 


function resolveInfo(link) { 
    return new Promise(function(resolve, reject) { 
    infobox(link, 'en', function(err, data){ 
     if (err) { 
     return console.log(err); 
     } 
     try { 
     var text = '{0}, {1}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}\n'.format(data.name.value, data.background.value, data.birth_name.value, data.birth_date.value, JSON.stringify(data.birth_place), data.origin.value, data.genre.text, JSON.stringify(data.occupation), data.instrument.text, data.years_active.value, data.label.value, data.website.value); 
     } catch(err){ 
     var text = ""; 
     } 
     resolve(text); 
    }); 
    }); 
} 


getLinks().then(function(links) { 
    getInfo(links).then(function(text){ 
    }); 
}); 
+0

あなたは、彼らがGoogleのES6テンプレートリテラル「 – JordanHendrix

+0

@JordanHendrixのちゃったごめんなさい何であるかを知らない場合だけ、ここではテンプレートリテラルを使用していない理由を私ので、今日の言葉は聞いたことがありません。私は文字通り、直前のノードで入力を開始しました。私は重いPythonとGoのバックグラウンドから来ています。私はちょうどそれを探検したが、それは文字列プロトタイプのいい代用品と思われるが、実際に問題を解決する助けにはならないが、どこの行console.log(テキスト)に私が期待しているデータが見えない。 – reticentroot

+1

ええ、ええ、私はあなたが知らないかもしれないと思った、見てみましょう、それは意味をなさない! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals – JordanHendrix

答えて

1

私はいくつか考えます。まず:可能であれば、矢印関数を使用して、もっとクリーンに見えるようにコードを作成します。

new Promise((resolve, reject) => { 
    //... 
}); 

詳細については、promisificationを参照してください。あなたはbluebirds約束ライブラリを使用する必要があります(私はとにかくそれをお勧めしたい)。

var fs = require("fs"); 
Promise.promisifyAll(fs); 
fs.readFileAsync("file.js", "utf8").then(...) 

なく、少なくとも最後に、チェーンあなたの約束を適切:

getLinks() 
    .then(getInfo) 
    .then(text => console.log(text)); 
+0

私はこれらの提案に感謝します。 – reticentroot

関連する問題