2017-01-12 7 views
0

hnews.getById(id)を使用してJSONオブジェクトを返す関数があります。私は約束に返された各話を配列にプッシュします。私はどのようにして完全な配列を得るのか分かりません。別の約束をする必要がありますか?プロミスから完全な配列を返します

function updateTopStories() { 
    var storiesArr = []; 

    hnews.getIdsInCategory('topstories', 60) 
    .then(function(ids) { 
     ids.forEach(function(id) { 
      hnews.getById(id).then(function(story) { 
       console.log(story); 
       storiesArr.push(story); 
      }); 
     }); 
    }); 

    return storiesArr; 
} 

var stories = updateTopStories(); 
console.log(stories); // Empty array 

編集:私はstoriesArr第二EDIT

updateTopStories();からを返す必要があります:私は馬鹿です。 getByIdはPromiseを返します。私は寝る時間だと思う。 modはこれを削除してくださいか?

ここから取り出せます。探してくれてありがとう。

+1

あなたは 'サンプルあなたが得る出力と予想される出力 –

+0

' hnews.getById(ID)を貼り付けることができますが約束またはJSONの配列を返しますか? – Agalo

+0

@Agalo 'hnews.getById(id)'はJSONオブジェクトを返します –

答えて

3

ここでは、複数の非同期プロセスを呼び出しています。これを処理する一般的な方法は、idsの配列を返す前に解決しなければならないPromiseの配列にマップすることです。これがあなたのために働くかどうか見てください。

+0

OPが書いたように、「 'hnews.getById(id)'は約束ではなくJSONオブジェクトを返します。 –

+0

@ try-catch-finally最終的に私はこのコメントを見ましたが、明らかに彼の元のコードは 'hnew.getById(id).then'を使っています。おそらくそれが最初かどうか尋ねてはいけませんでした;) – DeezCashews

+0

@ try-catch-finally更新されました。ごめんなさい。 –

0

私はこれを試すことができないので、私は確信していませんが、ここで問題をスコープしているように見えます。

 function updateTopStories() { 
     var tempStoriesArr = []; 

     hnews.getIdsInCategory('topstories', 60) 
     .then(function(ids) { 
      ids.forEach(function(id) { 
       hnews.getById(id).then(function(story) { 
        console.log(story); 
        tempStoriesArr.push(story); 
       }); 
      }); 
     }); 
     return tempStoriesArr; 
    } 

    var StoriesArr = updateTopStories(); 
    console.log(StoriesArr); 
+0

私はあなたの助けに感謝しますが、この場合アレイはまだ空です。 –

0

のようにして、それぞれの呼び出しからあなたの応答を再構築することができます:あなたが配列され、特定のIDグループのために、各話の初期化され、その後、あなたはidをに基づいて、各物語を取得することができます

ここ
function updateTopStories() { 
    var storiesArr = {}; 

    hnews.getIdsInCategory('topstories', 60) 
    .then(function(ids) { 
     ids.forEach(function(id) { 
      storiesArr[id] = []; 
      hnews.getById(id).then(function(story) { 
       console.log(story); 
       storiesArr[id].push(story); 
      }); 
     }); 
    }); 
    return storiesArr; 
} 

updateTopStories(); 

+0

オブジェクトはまだ空です。なぜそれが起こっているのか分かる他の理由はありますか? –

+0

作業コードのフィドルを追加できますか?それが助けになるだろう。 –

+0

すぐに答える前に質問の明確化を求めてください - この質問は現時点では十分ではありません。 –

0

変換する必要がある場合は約束を返し、 "then"ブロックから何かを返す必要があります。 Array.prototype.mapを使用して配列を変換できます。

function updateTopStories() { 
    return hnews.getIdsInCategory('topstories', 60) 
    .then(function(ids) { 
     return ids.map(function(id) { 
     return hnews.getById(id).then(function(story) { 
      console.log(story); 
      return story; 
     }); 
    }); 
    }); 
} 

updateTopStories().then(function(arr) { 
    arr.foreach(function(s) { 
    console.log('Story:', s); 
    }); 
}); 
+0

'storiesArr'が宣言されていません。このコードは失敗します。 'getById()'は、OPが最初の文章で書いたので、Promiseを返しません。 –

+0

@bsykはオブジェクトを返すと間違って述べました。 –

関連する問題