在node.js中声明值

我有一个function,

编辑1 – 更新的function与真正的一个,因为前一个是简化的同步function和代码将工作正如@AlexMA在评论中指出

'returnSuccessOrFailure': function () { return driver.findElement(wd.By.css('div#button')).then(function (button) { return button.getAttribute('class').then(function (status) { return status; }); }); } 

在我的node.jstesting中,我的断言失败,因为assert在returnSuccessOrFailure完成执行之前被调用。

 var value = returnSuccessOrFailure(); assert.equal(value,'success', 'Looks like something failed'); 

如果我在returnSuccessOrFailure实现一个承诺,并链接我的断言,那么这是有效的。 我的问题是,我是否必须始终执行承诺,以阻止执行? 我是Javascript新手,它的asynchronous性和任何洞察力何时使用承诺,什么时候不会有用。

你不必“执行诺言”,只要返回你已经拥有的那个:

 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'); } 

链接你断言不仅会使其工作,但也将使更多的可读代码。 知道什么时候按照什么顺序返回重构可能是有用的。 不仅如此,callback/承诺的结构也允许轻松地进行计时器testing。 另外,由于你的testing需要具有当前的执行状态,所以用callback中的assert语句编写testing是非常有必要的。

我的问题是,我是否必须始终执行承诺,以阻止执行?

注意承诺不会阻止执行。 他们推迟依赖于结果的代码的执行,注意你还在链接callback 。

我是Javascript新手,它的asynchronous性和任何洞察力何时使用承诺,什么时候不会有用。

只要有一些可能asynchronous运行的代码,并且需要传回一个asynchronous结果,Promise就很有用。 否则,你将需要使用callback,这是比承诺更丑陋的方式。

这是代码合约的一部分,代表了先决条件 (执行之前的内容), 后置条件 (执行后的内容)和对象不变 (不能更改)。 JavaScript没有本地支持,但可以使用第三方库( Cerny.js , ecmaDebug , jsContract或jscategory )

我认为这取决于你的编码风格,是EAFP (比容许更容易要求原谅)还是LBYL (先看你跳跃)。 两者都是可行的! 在大多数编译语言中,你可以使用LBYL 。 但是在Python中,例如你可以使用EAFP

一般来说, 如果你知道你会失败,你想快速失败 。 如果您喜欢使用断言来确保代码快速失败,则由您决定。