2016-05-22 4 views
2

NodeJSの新機能で、私の約束を守ります。 以下の簡単な例では、then関数がなぜ起動しないのか分かりません。データ変数は正常に設定されましたが、この時点以降は続行されません。bluebird.jsは機能しません

私は間違っていますか?

var AWS = require('aws-sdk'); 
var Promise = require('bluebird'); 

var docClient = new AWS.DynamoDB.DocumentClient(); 
Promise.promisifyAll(Object.getPrototypeOf(docClient)); 

var tableQuery = { 
    TableName : "Info", 
    KeyConditionExpression: "#rt = :rt", 
    ExpressionAttributeNames: { "#rt": "Type" }, 
    ExpressionAttributeValues: { ":rt": "Owner" } 
} 

docClient.queryAsync(tableQuery, function (err, data) { 
    return data; 
}).then(function(data) { 
    //doesn't get here... 
    return data.Items; 
}).done(function (item) { 
    console.log("Done." + item); 
}); 
+0

コンソールにエラーメッセージが表示されますか? –

+0

いいえ...それは単に続かない。それは待っているようです。 – Mike

+0

なぜあなたは 'queryAsync()'にコールバック関数を渡していますか? 'docClient.queryAsync(tableQuery).then(...)'でなければなりません。 – robertklep

答えて

3

は、チェーンを終了することです。何も渡さないでください。実際、特別な状況を除いてはまったく使用しないことをお勧めします。

プロミス・フルフィルメントthenハンドラはエラーを処理しません - エラーが見つかる場所は.catchです。方法は、値でエラーをconflateないことです - ので、データを取るあなたの機能は、(err, data)ではなくthenハンドラ内のデータのパラメータを取る必要があります:それはブルーバード混乱ので

const AWS = require('aws-sdk'); // prefer const in node 
const Promise = require('bluebird'); 

const docClient = new AWS.DynamoDB.DocumentClient(); 
Promise.promisifyAll(Object.getPrototypeOf(docClient)); 

var tableQuery = { 
    TableName : "Info", 
    KeyConditionExpression: "#rt = :rt", 
    ExpressionAttributeNames: { "#rt": "Type" }, 
    ExpressionAttributeValues: { ":rt": "Owner" } 
} 

docClient.queryAsync(tableQuery).then(data => data.Items).then(items => { 
    console.log("Done." + items); 
}); 

あなたのコードは失敗しました - それは、それは追加のパラメータを渡す作ら(手動で渡した)コールバックの後。それは効果的に約束を永遠に保留にしました。

関連する問題