我有一个功能,
Edit1 - 使用real更新了函数,因为前一个函数是简化的同步函数,代码在@AlexMA中正确指出了
'returnSuccessOrFailure': function () {
return driver.findElement(wd.By.css('div#button')).then(function (button) {
return button.getAttribute('class').then(function (status) {
return status;
});
});
}
在我的node.js测试中,我的断言失败,因为在returnSuccessOrFailure
完成执行之前调用了断言。
var value = returnSuccessOrFailure();
assert.equal(value,'success', 'Looks like something failed');
如果我在returnSuccessOrFailure
中实现一个承诺并链接我的断言,那么这是有效的。我的问题是,我是否必须始终为这种情况实施承诺来阻止执行?我是Javascript的新手,以及它的异步性以及何时使用promises以及何时不会有用的任何见解。
答案 0 :(得分:2)
你不必“实现承诺”,只需返回你已经拥有的承诺:
returnSuccessOrFailure': function () {
return driver.findElement(wd.By.css('div#button')).then(function (button) {
...
但是,是的,你仍然需要将你的断言放在done
处理程序
returnSuccessOrFailure().done(function(value) {
assert.equal(value,'success', 'Looks like something failed');
}
答案 1 :(得分:1)
链接你的断言不仅会使它工作,而且还会使代码更具可读性。在返回重构时,了解以什么顺序发生的事情会很有用。不仅如此,回调/承诺的结构也允许轻松编写定时器测试。 此外,由于您的测试需要具有当前的执行状态,因此很可能无论如何都需要在回调中编写带有断言的测试。
答案 2 :(得分:1)
我的问题是我是否必须始终为这种情况实施承诺来阻止执行?
请注意,promises不会阻止执行。他们推迟执行依赖于结果的代码,注意你是still chaining callbacks。
只要有一些可能异步运行并需要传回异步结果的代码,我是Javascript的新手,以及它的异步性质以及何时使用promises以及何时不会有用的任何见解。
Promise就很有用。否则你需要使用回调,这比承诺更丑陋。
答案 3 :(得分:1)
这是 code contracts 的一部分,代表前提条件(执行前保留的内容),后置条件(在您之后持有什么)执行)和对象不变量(什么不能改变)。 JavaScript没有本机支持,但您可以使用第三方库(Cerny.js,ecmaDebug,jsContract或jscategory)
我认为这取决于您的编码风格,是 EAFP (更容易请求宽恕而不是许可)或 LBYL (在您跳跃之前看)。两者都可行!在大多数编译语言中,您将使用 LBYL 。但是在Python中,您可以使用 EAFP 。
一般来说如果您知道自己会失败,那么您希望 fail fast 。如果您想使用断言来确保代码快速失败,则由您决定。