2016-01-24 53 views
1

我正在尝试创建一个帮助函数,该函数会进行异步调用,这是我的数据设置的一部分,用于执行protactor测试。有没有一种方法可以等待函数的响应,然后继续进行测试,这是我正在尝试做的。等待来自Async,Protractor,nodejs的响应

所以基本上测试应该等到异步调用lo loaddata()完成。我已阅读有关承诺的使用情况,但无法成功实施。

"use strict"; 

describe('sample passing test spec', function() { 
describe('sample passing test suite', function() { 
    loaddata(); 
    it('sample passing test', function() { 
    datall(); 
     expect("1").toEqual("2"); 
    }); 
    }); 
}); 



loaddata() is basically making a socket connection 

function loaddata(){ 
var net = require('net'); 

var client = new net.Socket(); 
client.connect(20000, '127.0.0.1', function() { 
console.log('Connected'); 
client.write('Hello, server! Love, Client\n'); 
}); 


client.on('data', function(data) { 
console.log('Received: ' + data); 
client.destroy(); // kill client after server's response 
}); 

client.on('close', function() { 
console.log('Connection closed'); 
}); 

return "function execution over" 

} 
+0

在Javascript中,你不能“等待”做一个异步操作。你可以安排一个回调被调用,或者返回一个Promise,当事件结束时触发它的'.then()'处理程序。其他代码将继续运行,而异步操作正在做它的事情。你不能用Javascript等待。可能值得一读[如何从异步操作返回响应?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) 。 – jfriend00

回答

1

你会需要调整loaddata回报承诺这将量角器放在Control Flow - 未决承诺的队列来解决:

function loaddata() { 
    var deferred = protractor.promise.defer(); 
    var net = require('net'); 

    var client = new net.Socket(); 
    client.connect(20000, '127.0.0.1', function() { 
     console.log('Connected'); 
     client.write('Hello, server! Love, Client\n'); 
    }); 


    client.on('data', function(data) { 
     console.log('Received: ' + data); 
     client.destroy(); // kill client after server's response 
     deferred.fulfill(true); 
    }); 

    client.on('close', function() { 
    console.log('Connection closed'); 
    }); 

    return deferred.promise; 
} 

如果这是你需要在您的测试运行之前在全球范围内完成,将其放入onPrepare()并返回。如果loaddata返回一个承诺,Protractor会先解决它,然后才运行测试:

onPrepare: function() { 
    return loaddata(); 
}, 
+0

感谢您的解决方案。 – vin7787