2

かなり複雑なスクレーパーを作成しているときに、コードの制御フローに関する問題に遭遇しました。

以下のコードで何が起こっているか: 1) URL を要求する 2) 結果から NEWURL をスクレイピングする 3) 最初の非同期関数として読みやすさ API に渡す 4) ここで問題が発生します — readabilityData を DB に保存する次の非同期関数を取得することはありません

この問題を解決するには?私は JS を初めて使用するので、私のコードの問題を指摘してください。

 request(URL, function(error, response, html) {
    if (!error) {
        var $ = cheerio.load(html);
            NEWURL = data.find('a').attr('href');

            readabilityData = {}                
            var articleUrl = 'https://readability.com/api/content/v1/parser?url=' + NEWURL + token;

            async.series([
                function(){
                    request(articleUrl, function(error, response, html) {
                        if (!error) {
                            readabilityData = response.toJSON();
                        }
                    });
                },
                function(readabilityData){
                    Article.findOne({ 
                        "link": url // here's the 
                    }, function(err, link){
                        if(link) {
                            console.log(link)
                        } else {
                                var newArticle = new Article({
                        // write stuff to DB
                                });
                                newArticle.save(function (err, data) {
                        // save it
                                });
                        }   
                    });
                }
            ],
            function(err){
               console.log('all good — data written')
            });


        });
    }
});
4

1 に答える 1

1

async.series各関数の作業が完了したときに、呼び出しの関数に渡されるコールバック パラメーターを呼び出す必要があります。async.seriesそれが、次の機能に進むことができることをどのように知っているかです。readabilityDataまた、関数間でデータを共有するために使用しようとしている場合は、関数パラメーターとして再定義しないでください。

次のようなものです:

var readabilityData = {};

async.series([
    function(callback){
        request(articleUrl, function(error, response, html) {
            if (!error) {
                readabilityData = response.toJSON();
            }
            callback(error);
        });
    },
    function(callback){
        Article.findOne({ 
            "link": url // here's the 
        }, function(err, link){
            if(link) {
                console.log(link);
                callback();
            } else {
                    var newArticle = new Article({
            // write stuff to DB
                    });
                    newArticle.save(function (err, data) {
            // save it
                        callback(err);
                    });
            }   
        });
    }
],
function(err){
   console.log('all good — data written')
});
于 2015-01-06T13:50:06.327 に答える