笑话说:
未解决的承诺
如果一个诺言根本无法解决,则可能会抛出此错误:
(依此类推)
就我而言,这不会发生。 我有这个测试:
from pyrfc import Connection
def login():
conn = Connection(user='xxxx', passwd='xxxxx', ashost='xxxx', sysnr='00', client='100')
f = conn.call('BAPI_XMI_LOGON', EXTCOMPANY= 'Test',EXTPRODUCT= 'Test Agent',INTERFACE='XAL',VERSION='1.0')
gettree=conn.call("BAPI_SYSTEM_MON_GETTREE", MONITOR_NAME={'MONI_NAME':'Filesystems','MS_NAME':'SAP CCMS Monitor Templates'},EXTERNAL_USER_NAME='anupk')
print gettree
conn.close()
login()
test('detect infinite loop', () => {
expect.assertions(1);
const vastPromise = VastUtils.parseFromUrl(infiniteLoopUrl);
const expectedError =
new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
return expect(vastPromise).rejects.toEqual(expectedError);
});
只需获取位于VastUtils
的XML并进行解析,如果该xml指向另一个xml,则infiniteLoopUrl
跟随链接,解析新的xml,合并并重复过程。
现在,VastUtils
指向一个引用自身的XML,因此它是一个无限循环。
“正确”,代码将无限地跟随xml链接,并且永远不会解决或拒绝承诺。
我希望上述测试在一定的超时后会失败,但是没有。
有人可以帮助我吗? 谢谢
编辑: 我正在尝试用一个较小的示例重现一个无限的Promise循环,这是我注意到的:
此测试在5s后正确失败:
infiniteLoopUrl
此测试5秒后不会失败(请保持无限循环)
test('Promise2', () => {
const genPromise = (): Promise<void> => {
return new Promise((res) => {
setTimeout(() => {
res();
}, 200);
})
.then(() => {
return genPromise();
});
};
const vastPromise = genPromise();
const expectedError =
new VastError(VastErrorCodes.WRAPPER_LIMIT_REACHED);
return expect(vastPromise).rejects.toEqual(expectedError);
});
显然,这些是相似的,但我不明白造成玩笑无限循环的区别...
答案 0 :(得分:1)
好的,我已经了解了问题。
原因是js的单线程性质。 在编辑部分的两个示例中,第一个示例有一个超时,因此有一段时间您可以控制并检查超时。 第二个不,所以开玩笑永远不要检查超时。
在我的真实情况下,问题出在假服务器上:它创建为:
server = sinon.fakeServer.create({
respondImmediately: true
});
响应立即使sinon同步响应,所以开玩笑永远无法控制。 创建为:
server = sinon.fakeServer.create({
autoRespond: true
});
sinon在10毫秒后做出响应,开玩笑可以检查经过的时间