Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中的Vows回调测试生成匿名错误_Javascript_Node.js_Asynchronous_Bdd_Vows - Fatal编程技术网

Javascript Node.js中的Vows回调测试生成匿名错误

Javascript Node.js中的Vows回调测试生成匿名错误,javascript,node.js,asynchronous,bdd,vows,Javascript,Node.js,Asynchronous,Bdd,Vows,我不熟悉Node.js应用程序中使用的异步计算的延续传递样式,我正在努力掌握一些相当基本的代码 我正在尝试编写一个库,它将创建一个到imap.gmail.com的imap接口,我正在尝试使用“vows.js”来遵循BDD(成功程度各不相同。我肯定不会遵循我应该遵循的完整的红色->代码->绿色循环,但用这种方式开始语言很难) 相关测试用例如下所示: var gmail = require('../lib/gmail.js'), vows = require('vows'), ass

我不熟悉Node.js应用程序中使用的异步计算的延续传递样式,我正在努力掌握一些相当基本的代码

我正在尝试编写一个库,它将创建一个到imap.gmail.com的imap接口,我正在尝试使用“vows.js”来遵循BDD(成功程度各不相同。我肯定不会遵循我应该遵循的完整的红色->代码->绿色循环,但用这种方式开始语言很难)

相关测试用例如下所示:

var gmail = require('../lib/gmail.js'),
    vows = require('vows'),
    assert = require('assert'),
    fs = require('fs');

vows.describe('Basic interface tests').addBatch({
  'A GMailInterface object can': {
    topic: function() {
      var gm = Object.create(gmail.GMailInterface);
      var settings_file = 'test/test_settings.json';
      var settings = JSON.parse(fs.readFileSync(settings_file));
      var that = this;
      gm.connect(settings.email,settings.password,function() {
        that.callback(gm); // ERROR BEING GENERATED HERE
      });
    },
     // ACTUAL VOWS OMITTED - the following is just a test of the callback
    'find an email' : {
      topic: function(gm) {
        console.log(">>>",gm);
      },
    }
  }
}).export(module)
如果我在“此处生成错误”行的正上方写一条console.log消息,它将打印出来。如果我在下面放一条信息,它就不会。测试的输出给出以下错误:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Uncaught, unspecified 'error' event.
    at EventEmitter.<anonymous> (events.js:50:15)
    at EventEmitter.emit (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows.js:236:24)
    at /Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:31:52
    at Object.callback (/Users/eblume/Repositories/my_stuff/gmail/node_modules/vows/lib/vows/context.js:46:29)
    at Array.0 (/Users/eblume/Repositories/my_stuff/gmail/test/gmail_test.js:17:14)
    at EventEmitter._tickCallback (node.js:192:40)

我哪里会出错?谢谢你的帮助

我建议大家仔细阅读“这”是如何工作的。如果没有人搞乱它,
that.callback的'that'指的是父对象,它用一个文本字符串标记为'GMailInterface对象can'

我怀疑是这个因素把你绊倒了。”“回调”应该被定义为与“主题”方法相同的对象的方法,就像你设置东西的方式一样,我并不认为它的工作方式是这样的

默认情况下,“this”通常指最近的祖先/父对象。它忽略包装函数,除非它们被用作使用“new”关键字的构造函数,在这种情况下,它指示对象实例。对于DOM中的事件回调(browser JS-not node.JS,就事件而言我不太了解),它通常指的是触发了事件的对象


这和自我之间没有真正的纠葛。我们只是倾向于使用这些来确定在对象具有聚合对象的情况下我们正在处理顶级对象。

感谢您的提示-您完全正确,我需要更彻底地研究“this”的绑定。但是,根据(检查顶部最黑暗部分的最后一个示例-关于异步剥香蕉的示例),看起来
这个
本身实际具有
回调
方法的东西绑定在一起。这一点可以通过将
callback
的参数中的
gm
替换为类似于
true
的内容来确认,后者将“>>>true”打印到控制台,然后无限期挂起。好的,在示例中,我看到了将新关键字用于分配给“topic”的对象。这意味着正在创建一个对象。这个话题很可能会被正在反应的事件击中,这也很可能成为目标。对于未来有类似问题的人,我只是简单地切换到了“摩卡”,在我看来,这是一个更好的BDD测试框架。它给了我一个更简洁、更容易理解的错误,并很快解决了我的问题(这实际上是连接中的一个失控事件循环,由不同的函数启动)
gm.connect = function(username,password,cb) {
  var self = this;
  self.conn = new ImapConnection({
    username: username,
    password: password,
    host: 'imap.gmail.com',
    port: 993,
    secure: true
  });

  async.series([
    function(callback){self.conn.connect(callback); },
    function(callback){self.conn.openBox('[Gmail]/All Mail',true,callback);}
  ],
  function(err,results) {
    if (err) {
      die(err);
    }
    process.nextTick(cb);
  });
};