如何让Node等待函数完成?

时间:2016-05-19 01:38:52

标签: node.js readline synchronous

我正在使用Protrator / Jasmine编写测试,该测试应该迭代几百条记录。测试必须单击几个链接,并且在整个过程中都有一些browser.sleep方法。总之,一次迭代测试大约需要10秒钟。

设置测试时,我有一个简单的数组循环:

verifyRecord = (record) ->
    ...
    element(`by`.id('generalSearch').sendKeys(record)
    element(`by`.id('submit').click()
    browser.sleep 3000
    ...
    expect(result).toBe(true)

records = [
    'RCD-001'
    'RCD-002'
    'RCD-003'
]

describe 'The crucial records', ->

    beforeEach ->
        browser.ignoreSynchronization = true

    it 'should be accessible to the user', ->
        browser.get '/path/to/form'
        for record in records
            verifyRecord(record)

这很好用。每个verifyRecord调用同步发生,在下一个触发之前完成。但是记录列表很长并且发生了变化,因此我需要从文本文件中提取它,而不是在我的脚本中对其进行硬编码。

如果我尝试使用readline从文件中提取记录ID并对其进行迭代,则会立即将它们发送到veryifyRecord函数。

fs = require 'fs'
readline = require 'readline'

verifyRecord = ...

describe 'The crucial records', ->

    beforeEach ->
        browser.ignoreSynchronization = true

    it 'should be accessible to the user', ->
        browser.get '/path/to/form'

        lineReader = readline.createInterface({
            input: fs.createReadStream 'records.txt'
        })

        lineReader.on 'line', (line) ->
            verifyRecord(line)

我想使用readline会导致异步调用verifyRecord。如果我在console.log(record)方法中添加verifyRecord,则所有记录ID几乎立即被转储到终端。

我也尝试将结果加载到本地数组中,然后迭代:

records = []
lineReader.on 'line', (line) ->
    records.push line
for record in records
    verifyRecord(record)

这也不起作用。

在使用列表中的下一条记录调用方法之前,如何让lineReader等待每个verifyRecord调用完成?

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用Mocha

或者,您可以返回Promise,而不是使用done()回调。如果您正在测试的API返回promises而不是回调,那么这很有用:

beforeEach(function() {
  return db.clear()
    .then(function() {
      return db.save([tobi, loki, jane]);
    });
});

describe('#find()', function() {
  it('respond with matching records', function() {
    return db.find({ type: 'User' }).should.eventually.have.length(3);
  });
});