2016-05-22 5 views
2

Neu bei NodeJS, verspricht meinen Kopf herum. In diesem einfachen Beispiel unten verstehe ich nicht, warum die then-Funktion nicht ausgelöst wird. Die Datenvariable wurde erfolgreich festgelegt, wird jedoch nach diesem Zeitpunkt nicht fortgesetzt.bluebird.js funktioniert dann nicht feuern

Was mache ich falsch?

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

Wird in der Konsole eine Fehlermeldung angezeigt? –

+0

Nein ... es geht einfach nicht weiter. Es ist wie sein Warten. – Mike

+0

Warum übergeben Sie eine Callback-Funktion an 'queryAsync()'? Es sollte 'docClient.queryAsync (tableQuery) .then (...)' sein – robertklep

Antwort

3

.done in drossel ist eine Kette zu beenden, versuchen Sie nicht etwas zu übergeben. In der Tat - es ist wahrscheinlich eine gute Idee, sie überhaupt nicht zu verwenden, außer in besonderen Umständen.

Versprechen Erfüllung then Handler nicht mit Fehlern umgehen - .catch tut, wo Sie den Fehler finden können. Methoden sind nicht Fehler mit Werten conflate - so Ihre Funktionen, die Daten nehmen einen Datenparameter in den then Handler statt (err, data) nehmen sollen:

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); 
}); 

Ihr Code ist fehlgeschlagen, weil es drossel verwirrte - es machte es einen zusätzlichen Parameter übergibt nach dem Rückruf (den Sie manuell übergeben haben). Das machte das Versprechen für immer aus.