Firebase Web 2.4.0承诺Nodejs

我在使用Node应用程序中的Firebase Web进行错误callback时遇到了一些问题。

原来的问题是,一个.set的错误callback显然没有被启动,当我预期它是。

在debugging过程中,我将Firebase npm模块升级到最新的2.4.0(NodeJS 0.10.28),然后注意到asynchronous调用有一个新的Promise语法。

我没有find使用新语法的例子,但做了一个小提琴 ,它似乎以我期望的方式在浏览器中工作。

var fb = new Firebase("https://katowulf-examples.firebaseio.com/"); // monitors changes and updates UI try { fb.child('sorted_widgets').orderByChild('name').equalTo('one').once('value').then(handleSuccess).catch(handleError) fb.child(undefined).once('value').then(handleSuccess).catch(handleError) fb.child('sorted_widgets').set(undefined).then(handleSuccess).catch(handleError) } catch (err) { console.error('Caught an error', err) } function handleSuccess(snap) { console.log('snap: ', snap.val()) } function handleError(err) { console.log('error:', err) } 

我现在试图在我的Node应用程序中使用该语法,并得到这个错误:

 TypeError: Object #<nb> has no method 'catch' at myFunction (/node_scripts/my_script.js:514:19) at c (/node_modules/firebase/lib/firebase-node.js:238:58) at /node_modules/firebase/lib/firebase-node.js:199:710 at ec (/node_modules/firebase/lib/firebase-node.js:52:165) at ac (/node_modules/firebase/lib/firebase-node.js:31:216) at bc (/node_modules/firebase/lib/firebase-node.js:30:1259) at Ii.h.Ib (/node_modules/firebase/lib/firebase-node.js:218:287) at Qh.h.Jd (/node_modules/firebase/lib/firebase-node.js:185:251) at Eh.Jd (/node_modules/firebase/lib/firebase-node.js:175:364) 

我注意到的一件事情是,并不是所有的错误都被.catch()所捕获。 我把Javascript尝试抓住小提琴演示,但它是一个单独的问题。

鉴于我遇到问题的顶部问题,我想知道是否有问题,我的节点安装,所以已重新安装节点,并删除并重新安装我的node_modules。 我还没有取得任何进展。

有没有人得到在节点中工作的新的Promise语法? 有什么build议吗?

我认为有3件事情正在进行:

  1. 节点v0.10.28不带有Promise的内置实现。
  2. firebase模块捆绑了一个Promise / A +兼容的实现,它在尚未定义的情况下使用。
  3. 我们随.catch()实现是纯Promise / A +实现,不包括.catch()

然而, .catch()是非常有用的,虽然不是Promise / A +的一部分,但它是半标准的,因此我们打算继续,并将其添加到即将发布的捆绑Promise实现中,这应该可以解决您的问题。

在此期间,您可以执行以下任何操作:

  • 使用.then(null, function(err) { ... })而不是.catch(function(err) { ... })
  • 将合适的Promise实施导入到您的环境中。 例如global.Promise = require('rsvp').Promise;
  • 升级到节点v0.12.x或更新的版本,内置Promise实现(支持.catch() )。

可用时,Firebase将使用底层的Promise实施。 看起来像节点环境中的Promises实现不支持catch() ,这不是必需的。

从此:

 .then(handleSuccess).catch(handleError) 

只是一个不同的符号:

 .then(handleSuccess, handleError) 

你可以和后者一起工作。

我最初的评论的副本:

也许你的节点版本没有实现promise .catch函数,但是浏览器呢。 如果不了解更多有关节点设置的信息,很难说。

有一件事要办,就是拉一个单独的库来处理promise。 蓝鸟是一个受欢迎的。 尝试使用npm install bluebird,然后在使用Promise Promise = require(“bluebird”)的文件顶部。

一些更多的信息:

我现在看到你正在使用es6-promises polyfill。 再次,我不太了解你的节点/转发设置是否确定。 一个猜测是,Firebase sdk源代码可能需要用polyfill进行编译才能使sdk生效。 所以暂时还是值得临时拉蓝鸟作为一个健康检查。