ウェブスクレイピングでハイパーリンクアンカーのリストを取得する関数を記述しました。プロミスが空のリストを返します
これらのアンカーをすべてオブジェクト配列にプッシュします。この配列は、後でJson文字列にシリアル化されます。
Api.GetCourseSubmenuUrl
の方法とApi.FilterSubmenuContentList
の両方が約束を返します。
しかし、次のコードは、配列が.each()
cheerio関数で埋められるのを待つことなく実行し続けます。なぜこれが起こるのですか?
cheerioの各メソッドは同期しています。
私のコードは、パッケージを使用します:
- ブルーバード(https://github.com/petkaantonov/bluebird)
- チェリオ(https://github.com/cheeriojs/cheerio)
- 要求(https://github.com/request/request)
コード:
Connection.prototype.FillCourseWithSubmenuContent = function(course){
var self = this; //This class
var submenuItems = [];
return new BPromise(function(resolve, reject){
return Api.GetCourseSubmenuUrl(ApiConnection.authToken).then(function(response){
return request.get({url: self.url + response.url + course.id, followRedirect: false, jar: cookiejar}, function(err,httpResponse,body){
if(err){
reject(err);
}
var cheerio = require('cheerio');
var dashboardhtml = cheerio.load(body, {
normalizeWhitespace: true,
decodeEntities: true
}
);
//Find all the links on the page
dashboardhtml('a').each(function(i, elem) {
console.log("Object:");
console.log({"text":dashboardhtml(elem).text(), "url":dashboardhtml(elem).attr('href')});
submenuItems.push({"text":dashboardhtml(elem).text().trim(), "url":dashboardhtml(elem).attr('href')});
});
resolve();
});
}).then(function(){
console.log(submenuItems);
return Api.FilterSubmenuContentList(ApiConnection.authToken, submenuItems);
});
}).catch(function(error){
return reject(error);
});
};
が([ 'Promise'コンストラクタアンチパターン]を避けますhttp://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-反パターン - と - 回避する方法 - それ)! – Bergi
呼び出している 'reject'関数はスコープ内でさえありません。 – Bergi
@Bergi私は反パターンが私のコードにどのように訴えるのかを本当に把握していませんか?どこが間違っていますか?それは約束の中で約束をすることですか?あなたは最初の拒否について話していますか? – Dragon54