快递承诺不起作用

时间:2015-04-19 21:07:45

标签: javascript node.js express promise

我很有承诺,我认为我不能正确理解它,因为我在我的代码中尝试了它而没有成功。

我在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

可能的方法"承诺"未定义。我不确定我是否使用了表达承诺错误,或者仅仅是因为我对整个承诺缺乏了解。需要一些提示,请

1 个答案:

答案 0 :(得分:1)

  

可能方法“承诺”未定义。

不,似乎已定义promise函数。只有它是一个函数,而不是一个promise对象,并且没有.then方法。

  

我不确定我是否使用express-promise错误

是。根据我的理解their docs,它似乎只是让res.sendres.jsonres.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);