是否可以指定应在实习生中调用asyn回调的情况?假设我们有一个测试测试一个连续执行多个XHR请求的方法。具体来说,我正在尝试测试我为Strophe.connect提供的回调实现。它的工作方式是将多个XHR请求发送到服务器,该服务器处理初始XMPP(BOSH)握手。
是否有可能在5秒内测试回调被调用状态码为5(已连接)?问题是回调被多次触发,我需要等待正确的状态代码,扔掉其他代码。
var dfd = this.async(5000);
conn.connection.connect("jid", "pass", dfd.callback(function(status) {
if(status === 5) {
expect(status).to.have(something);
} else {
// here, I need to say intern to
// do nothing, just let the callback
// to be triggered once more
}
return true;
}));
答案 0 :(得分:1)
因为您的回调将被多次调用,我建议明确解决延迟而不是用dfd.callback
包装回调。尝试这样的事情:
var dfd = this.async(5000);
conn.connection.connect('jid', 'pass', dfd.rejectOnError(function (status) {
if (status !== 5) {
return;
}
// do any assertions here
// explicitly resolve the test since it was successful to this point
dfd.resolve();
}));
首先,您会注意到我们用dfd.rejectOnError
包装回调。如果在执行回调函数期间抛出任何错误,此便捷方法将拒绝延迟。接下来,我们摆脱了dfd.callback
,因为如果包装的回调执行而没有抛出错误,这将尝试解决延迟。因为您的回调将被多次调用,所以这不起作用。通过仅在满足条件时显式解析延迟(status !== 5
且任何断言通过),只要延迟在五秒内解析,您的回调就可以执行任意次数。