1

RSS URL を要求し、リンクを解析してから、各リンクを要求する必要があるプロミス チェーンがあります。最初の部分はうまく機能します。ただし、解析された各リンクを要求する「約束を挿入する」方法を理解するのに苦労しています。

リンク URL の単純な配列を生成することから始めましたが (推奨される方法)、それを機能させることができませんでした。このコードは、各 URL を要求するプロミスの配列を生成するようになりましたが、それを機能させる方法もわかりません。おそらく私はQ.all()を使用する必要がありますが、それは所定の機能のためのようですか?

requestRss(rssSourceUrl)
.then(function(links) { 
    // ???
})
.catch(function(error) {
    console.log(error);
})
.done();

function requestRss(url) {
    var deferred = q.defer();
    request(url, function(err, resp, body) {
            if (err || resp.statusCode !== 200) {
                deferred.reject(new Error(resp.statusCode + ' ' + err + ' ' + body));
            } else {
                $ = cheerio.load(body);
                var linkRegex = /<link>([^<$]+)/gim;
                var someLinks = new Array();
                $('item').each(function() {
                    var match = linkRegex.exec($(this).html());
                    if (match) {
                        var link = match[1];
                        someLinks.push(
                            function() { requestSomeLink(link); }
                        );
                    }
                });
                deferred.resolve(someLinks);
            }
        });
    return deferred.promise;
}

function requestSomeLink(url) {
    var deferred = q.defer();
    request(url, function(err, resp, body) {
            if (err || resp.statusCode !== 200) {
                deferred.reject(new Error(resp.statusCode + ' ' + err + ' ' + body));
            } else {
                $ = cheerio.load(body);
                deferred.resolve(body);
            }
        });
    return deferred.promise;
}
4

2 に答える 2

2

コードは、各 URL を要求する promise の配列を生成するようになりました

実際には、呼び出されたときにそれぞれが URL リクエストの promise を生成する関数の配列です。単純にリンク (文字列) の配列にする必要があると思います。それ以上のことは何もしません。それらで何が起こるかは、別の関数で決定する必要があります。そう

function requestLinksFromRss(url) {
    …
                    if (match)
                        someLinks.push(match[1]);
    …
    return deferred.promise;
}

おそらく私は Q.all() を使用する必要がありますが、それは所定の機能のためのようですか?

「所定の機能」の意味がわかりません。Q.all()引数として promise の配列を取るだけです。それがここにあります。

requestLinksFromRss(rssSourceUrl).then(function(links) { 
    var promiseArr = links.map(requestSomeLink); // or a loop if you want
    return Q.all(promiseArr);
}).then(function(ressources) {
    // now you have an array of request bodies.
    // Do something with them.
}).catch(console.log.bind(console)).done();
于 2013-07-18T21:30:34.477 に答える
1

「約束の配列」を生成するのではなく、最終的に約束を返す関数の配列を生成します。これらの関数をどこで呼び出しますか?

リンクの配列を返すことに戻り、まだ requestSomeLink(url) 関数があるとします。

requestRss(rssSourceUrl)
.then(function(links) { 
    var index;
    for (index = 0; index < links.length; index++) {
        requestSomeLink(links[index]).then(function(data) {
            // do something with data
        }
    }
})
于 2013-07-18T21:18:40.983 に答える