我很有承诺,我认为我不能正确理解它,因为我在我的代码中尝试了它而没有成功。
我在NodeJS上有一个服务器,使用Express库和express-promise
var express = require('express');
var app = express();
app.use(require('express-promise')());
然后我正在处理ajax查询:
var promise = function() {
for(var query in req.query ){
console.log( 'query: ', query );
switch( query ){
case 'getobserved':
results.observedTags = getObserved();
break;
...
}
}
};
getObserved从Firebase DB获取数据
var getObserved = function() {
var observedTags = dbRef.child('observedTags');
observedTags.on('value', function(snap) {
var allObservedItems = snap.val();
var list = [];
for(var ii in allObservedItems ){
list.push( allObservedItems[ii].name );
}
return list;
});
};
最后我试图通过以下方式向客户发送回复:
promise.then( res.send( results ), someRejectedMethod );
我进入控制台:
TypeError: undefined is not a function
at d:\wamp\www\soz2\server.js:100:13
可能的方法"承诺"未定义。我不确定我是否使用了表达承诺错误,或者仅仅是因为我对整个承诺缺乏了解。需要一些提示,请
答案 0 :(得分:1)
可能方法“承诺”未定义。
不,似乎已定义promise
函数。只有它是一个函数,而不是一个promise对象,并且没有.then
方法。
我不确定我是否使用express-promise错误
是。根据我的理解their docs,它似乎只是让res.send
,res.json
和res.render
接受包含承诺的承诺或对象,然后递归展开和等待
或者只是我对整个承诺缺乏了解。
那也是。我建议general promise resources作为了解承诺的切入点。
首先,您必须promisify使用Firebase方法,以便getObserved
确实返回一个承诺。 (目前,它似乎失败了,因为你尝试return
from an async callback)。如果你还没有使用它,你可能不得不选择一个承诺库。
然后,在您的路线中,您可以像
一样使用它for (var query in req.query) {
console.log('query: ', query);
switch(query) {
case 'getobserved':
results.observedTags = getObserved(); // a promise
break;
…
}
}
res.json( result ); // here, express-promise does some magic
不需要var promise = function() {
行。而且您可能也可以废弃promise.then( res.send( results ), someRejectedMethod );
,因为快递承诺会为您处理此问题。如果您没有使用它,您可以使用
var promise = getObserved();
promise.then(function(list) {
res.json({observedTags: list});
}, someRejectedMethod);