私はウェブサイトからデータを引き出しています。引っ張られるデータはパニーナイズされる。最初のページにリクエストを行うと、nextCursor
を含む応答が返されます。このカーソルは、ページ2の結果を取得するために使用する必要があります。各ページ要求にはnextCursor
が必要です。プロミスとループを使用していますか?
ループを作成する方法が見つからないため、私はこの約束を使用して実装するのに苦労しています。これは私がそれを約束せずに動作すると仮定する方法である(ないテストし、それは私が何をしようとしている実証):あなたは、ループ内の反復回数を見ることができるように
let nextCursor = argv.initalCursor
do {
let r = request('http://example.com/items.php?cursor=' + nextCursor, function(err, resp, body) {
if(err) throw new Error(err)
// Do something with the data
nextCursor = JSON.parse(body)['nextCursor']
})
} while(nextCursor)
は不明です。応答にnextCursor
がなくなるまでループします。
私がしたいことは、約束を使用してこれを実装することです。私は、各リクエストが最後のリクエストに依存しているため、同様の方法で動作するループを作成する方法はわかりません。
これはどのように約束を使用して動作しますか?
return self.cursorRequest
の場合、私の現在の解決策は失敗しています。スクリプトは単に実行を停止します。
'use strict'
let Promise = require('bluebird')
let _ = require('lodash')
class Event {
constructor(session) {
this.session = session
this.scrapedIDs = [] // I don't like this!
}
parseGuestsAndCursor(json, guestType) {
let ids = json['payload'][guestType]['sections'][2][1].map(function(user) {
return user['uniqueID']
})
return {
ids: _.uniq(ids),
cursor: json['payload'][guestType]['cursor']
}
}
cursorRequest(cursor, eventID, guestType) {
let self = this
return new Promise(function(resolve, reject) {
let url = `https://example.com/events/typeahead/guest_list/?event_id=${eventID}&tabs[0]=${guestType}&order[${guestType}]=affinity&bucket_schema[${guestType}]=friends&cursor[${guestType}]=${cursor}&dpr=1&__user=${self.session.uid}&__a=1`
self.session.request(url, function(err, resp, body) {
if(err) reject(err)
let json
try {
json = JSON.parse(body.substring(9))
} catch(err) {
reject(err)
}
resolve(self.parseGuestsAndCursor(json, guestType))
})
})
}
members(eventID, limit, guestType) {
let self = this
let ids = []
return new Promise(function(resolve, reject) {
let url = `https://example.com/events/typeahead/guest_list/?event_id=${eventID}&tabs[0]=watched&tabs[1]=going&tabs[2]=invited&order[declined]=affinity&order[going]=affinity&order[invited]=affinity&order[maybe]=affinity&order[watched]=affinity&order[ticket_purchased]=affinity&bucket_schema[watched]=friends&bucket_schema[going]=friends&bucket_schema[invited]=friends&bucket_schema[ticket_purchased]=friends&dpr=1&__user=${self.session.uid}&__a=1`
self.session.request(url, function(err, resp, body) {
if(err) reject(new Error(err))
let json, guests
try {
json = JSON.parse(body.substring(9))
guests = self.parseGuestsAndCursor(json, guestType)
} catch(err) {
reject(err)
}
self.cursorRequest(guests.cursor, eventID, guestType).then(function(guests) {
self.scrapedIDs.concat(guests.ids).map(function(user) {
return user['uniqueID']
})
if(guests.cursor) {
return self.cursorRequest(guests.cursor, eventID, guestType)
}
else {
resolve(self.scrapedIDs)
}
})
})
})
}
}
module.exports = Event
私は全然そこにどんな約束が表示されません。 –
@ T.J.Crowder私は約束でやろうとしていることをどのように実装するかわからないので、そうはありません。だから、私はこのようなことを約束どおりにするにはどうしたらよいのでしょうか?私は、ソリューションを必要とせず、助けることができるあらゆるリソースへのポインタです。 – BugHunterUK
解決する前にすべてのデータが取得されるまで待つことを約束しますか? –