各変数の中身が分からないので、
回答者が最後まで面倒みるのは不可能です。
Promiseの書き方は試行錯誤の後が見れますが、sousukeさんの仰るように
何か簡単なresolveやrejectを発火するコードを書いて動作を確かめてみてください。
さて、それ以外のどう見ても駄目そうな箇所を幾つか突っ込みます。
var loopProcess = function(callback)
このコールバック関数は何?
- goGoogleとgoYahooって非同期な処理じゃないの?
.then(finishProcess())
何も待たずに発火して評価開始してる件
var loopProcess = function(callback)
このコールバック関数は何?
試行錯誤の後でしょうね。
これは普通の非同期処理を書く時のやり方で、
新しいPromiseを使った非同期処理の時は不要です。
コードを見せる時に削っておきます。
goGoogleとgoYahooって非同期な処理じゃないの?
質問文に「Inside Loopのログが1回だけ出て」という記載があるのでほぼ確定でしょう。
goGoogleがコールバック関数を要求するのか、はたまたPromiseを返すのかでまた分岐しますが、
全て実行完了するのを待ってからresolve(value)にするべきでしょう。
もっと言うなら、お外のスコープで宣言した_result_html
を書き換える設計は死ぬほどダサいです。
resolve(value)の中身を_result_html
として実行するべきでしょう。
更に一手進めてasync / awaitを使ってリファクタリングすればこんな感じになると想定されます。
JavaScript
1// loopProcess :: Object -> Promise
2const loopProcess = async options => {
3 const {search, keywords, user_agent, check_keyword} = options
4 const results = []
5 for (const keyword of keywords) {
6 console.log("Inside Loop")
7 // なんでキーワード全て同じ検索エンジンになるの?外からもってきなさい
8 // searchはPromiseを返す関数と決め打ちしてawaitで待つ
9 const result = await search(keyword, user_agent, check_keyword)
10 results.push(result)
11 }
12 return results
13}
14
15// 恐らくgoGoogleとgoYahooもリファクタリングの必要あり
16const search = _search_engine == "google" ? goGoogle : goYahoo
17const options = {
18 search,
19 keywords: _keyword_array,
20 user_agent: _user_agent,
21 check_keyword: _check_keyword
22}
23loopProcess(options)
.then(finishProcess())
何も待たずに発火して評価開始してる件
発火させてはいけません。
前のPromiseのresolve(value)
の第一引数(value)がthenの第一引数に格納されて発火される作りになっているからです。
このように記述してください。
JavaScript
1// Promiseである必要はないので普通の関数にした
2finishProcess = (html, area, results) => {
3 // TODO: resultsを加工する
4 const result_html = toResultHTML(results)
5 area.innerHTML += html + result_html + "</table>"
6 console.log("finish end process")
7}
8
9// options変数は前章を参考
10// _result_htmlと_result_areaはfn.prototype.bindを使って束縛する
11loopProcess(options)
12 .then(finishProcess.bind(null, _result_html, _result_area))
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/27 05:22