2015-08-26 107 views
1

我有一個令人沮喪的問題。 我正在嘗試提取許多類中使用的函數。 這樣做會給我帶來'完成'回調的問題。 這裏是我的代碼:異步回調不會被調用

我已經提取的功能,並把它添加到util.js中:

var chai = require('chai'); 
var expect = chai.expect; 
var util = exports = module.exports = {}; 

chai.use(require('chai-http')); 
chai.use(require('chai-string')); 

util.testAsyncCalls = function testAsyncCalls(urlArray, urlSuffix, result, callback) { 
    async.each(urlArray, function (url, callback) { 
     chai.request(url) 
      .get(urlSuffix) 
      .then(function (res) { 
       expect(res).to.have.status(200); 
       expect(res.body.totalStatus, res.body.summary).to.equalIgnoreCase(result); 
       callback(); 
      }) 
      .catch(function (err) { 
       callback(err); 
      }); 
    }); 
}; 

然後,在測試本身,我調用該函數類似下面:

var config = require(process.env.CONFIG || '../env.json'), 
    util = require('../util.js'); 
    describe('App', function() { 
     it('Is /home ok ?', function(done) { 
      util.testAsyncCalls(config.url.applications, '/home/info', 'SUCCESS', done); 
     }) 
    }); 

通過摩卡運行測試給我以下錯誤:

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

當我PE對正常的url進行修改,我得到一個有效的回覆,所以我認爲回調是問題所在。 任何人都可以幫忙嗎?

在此先感謝。 問候

回答

0

你必須在每月底打電話給你的「全球性」的回調,在each signature

util.testAsyncCalls = function testAsyncCalls(urlArray, urlSuffix, result, callback) { 
    async.each(urlArray, function (url, next) { 
     chai.request(url) 
     .get(urlSuffix) 
     .then(function (res) { 
      expect(res).to.have.status(200); 
      expect(res.body.totalStatus, res.body.summary).to.equalIgnoreCase(result); 
      next(); 
     }) 
     .catch(function (err) { 
      next(err); 
     }); 
    }, callback); 
}; 

看作是一個很好的做法,回調子範圍不使用相同的名稱,例如在你的每個中使用'next'而不是'callback'。

+0

它的工作原理,非常感謝。我很困惑,因爲我認爲superMethod從.then()或.catch()方法收到回調。不知道它們必須在每個之後被調用。 – Homewrecker