JSDOM函数没有完成

时间:2015-12-28 14:17:39

标签: javascript asynchronous mocha jsdom

请帮助我理解这里有什么问题:

这是我的js代码(简化为隔离演示问题所需的最小代码):

'use strict';
var jsdom = require('jsdom');
describe('desc', function () {
    it('should', function () {
        function uploadURL(callback) {
            jsdom.env({
                url: "http://digg.com",
                done: function (errors, window) {
                    console.log("inside");
                    callback("abc");
                }
            });
        }

        uploadURL(function(x){
            console.log("returned " + x);
        });
    });
});

这是我的命令行:

  

node_modules / mocha / bin / mocha tests / test.js

当我运行上面的脚本时,我得到以下输出:

  desc
    ✓ should (196ms)
  1 passing (204ms)

一旦我删除jsdom部分并只运行包含console.log和callback的uploadURL()部分,我就会回复:

desc
inside
returned abc
    ✓ should
  1 passing (5ms)

似乎jsdom部分在脚本结束之前没有执行。 这是为什么以及如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

因为它是异步的。要使用Mocha测试异步函数,您接受Mocha的it提供的回调,并在异步完成时调用它:

'use strict';
var jsdom = require('jsdom');
describe('desc', function () {
    it('should', function (done) {
    //                     ^---------------------- accept the callback
        function uploadURL(callback) {
            jsdom.env({
                url: "http://digg.com",
                done: function (errors, window) {
                    console.log("inside");
                    callback("abc");
                }
            });
        }

        uploadURL(function(x){
            console.log("returned " + x);
            done();                            // <=== Call it
        });
    });
});

Mocha文档here中介绍了这一点。