我寫了一個函數,通過webscraping獲取超鏈接錨點列表。Promise返回空列表
我想將所有這些錨點推到一個對象數組上,該對象數組稍後將被序列化爲一個Json字符串。
Api.GetCourseSubmenuUrl
方法和Api.FilterSubmenuContentList
都返回承諾。
但是,下面的代碼保持運行,而不會等待在.each()
cheerio函數中填充數組。爲什麼會發生?
請注意,cheerio中的每種方法都是同步的。
我的代碼使用的包:
- 藍鳥(https://github.com/petkaantonov/bluebird)
- Cheerio(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