2016-04-16 2 views
1

なぜこの一連の約束が乱れるのですか?最後の.thenブロックの "object"オブジェクトは、実行時には未定義です。ES6 Node-MySQLを使用しているときに異常終了する約束

.then(posts => { 

    getConnection().query("SELECT * FROM shows", (err, rows) => { 
     if (err) throw new Error(err) 
     else return { posts: posts, shows: rows } 
    }) 

}) 

new Promise(function(resolve, reject) { 

    getConnection().query("SELECT * FROM blog", (err, rows) => { 
     if (err) reject(err) 
     else resolve(rows) 
    }) 

}).then(rows => { 

    let posts = [] 

    for (let i = 0; i < rows.length; i++) { 
     posts.push({ 
      id:  rows[i].id, 
      ... 
     }) 
    } 

    return posts 

}).then(posts => { 

    getConnection().query("SELECT * FROM shows", (err, rows) => { 
     if (err) throw new Error(err) 
     else return { posts: posts, shows: rows } 
    }) 

}).then(object => { 

    let posts = object.posts 

    let post_container = { my: [], your: [] } 

    post_container.my = posts.filter(x => x.section === "my") 
    post_container.your = posts.filter(x => x.section === "your") 

    return post_container 

}) 
+0

2番目のクエリは、それが狂っている場所です。すべての変数は 'getConnection()。query(" SELECT * FROM "は' 'ここにログを置くべきかどうか1"をクエリのコールバックに指定し、 '' let posts = object ''の下に 'here 2'ここで2は一貫してここの前にあります。 – Connorelsea

+1

サイドノート:あなたのコードで 'rows #'を' posts'に変換する 'Array#map'を使ってみてください。 –

答えて

3

あなたreturn ... queryコールバック、ないthenコールバックからのリターン。その戻り値は完全に無視されます。 thenコールバックに明示的なreturnがないので、undefinedで解決された約束を返します。でコールされます(上記の非同期作業が行われる前に)。thenコールバックが呼び出されます。

thenコールバックからすぐに使用する値または約束を返す必要があります。 thenコールバックでコードが非同期であるため、非同期作業が完了したとき、あなたはそう、あなたが落ち着くの約束を返すようにしたいでしょう:

.then(posts => { 
    return new Promise((resolve, reject) => { 
     getConnection().query("SELECT * FROM shows", (err, rows) => { 
      if (err) reject(/*...reject reason...*/) 
      else resolve({ posts: posts, shows: rows }) 
     }) 
    }) 
}) 

あなたは約束のlibsの一つに見えるかもしれませんNodeJSコールバックがコード内でより直接的に使用できるようにします。少なくともカップルがいますし、あなたは約束した約束を使用することができます。queryは毎回独自に作成する必要はありません。

+1

"あなたは値をすぐに使うか約束するか... "ということは、実際に約束や約束については少しクリックするだけです。時間制限が許せば答えを受け入れます。ありがとうございます。 – Connorelsea

関連する問題