Javascript 如何在量角器承诺链中将,expect()与非量角器承诺混合?

Javascript 如何在量角器承诺链中将,expect()与非量角器承诺混合?,javascript,typescript,jasmine,protractor,Javascript,Typescript,Jasmine,Protractor,我试图理解如何(以什么顺序)在量角器中执行承诺,特别是对于与量角器承诺混合在一起的非量角器承诺(ex.native或q承诺)。 我正在调试和修复一些工作中的脆弱量角器测试,我完全不是一个JavaScript程序员;所以,当给出你的答案时,假设你的答案会越过我的大脑,并将其降低一两级 在经历了几天的失败后,我决定写一些非常简单的例子来理解承诺链是如何执行的。 从我在网上读到的内容来看,我认为链接是这样的: a().then(() => { x(); b().then(() =

我试图理解如何(以什么顺序)在量角器中执行承诺,特别是对于与量角器承诺混合在一起的非量角器承诺(ex.native或q承诺)。 我正在调试和修复一些工作中的脆弱量角器测试,我完全不是一个JavaScript程序员;所以,当给出你的答案时,假设你的答案会越过我的大脑,并将其降低一两级

在经历了几天的失败后,我决定写一些非常简单的例子来理解承诺链是如何执行的。 从我在网上读到的内容来看,我认为链接是这样的:

a().then(() => {
    x();
    b().then(() => {
        y();
        c().then(() => z());
    });
});
应与以下内容相同:

a().then(() => {
    x();
    b();
}).then(() => {
    y();
    c();
}).then(() => z());
这也应该与此相同(如果我在工作中使用ES6,我不会):

您可以在这里看到我的完整代码以及我得到的输出:

对于所有这些场景,以及使用本机承诺和量角器承诺时,我得到了不同的结果。
在second_spec.ts中,我还尝试在应该失败的承诺中添加expect()语句,我希望链接在expect()之后的承诺不会执行,因为expect应该抛出断言错误,但我看到的是,它执行之后的所有承诺都会执行,但由于expect()失败,测试仍然失败。非常奇怪…

你的一个问题包含许多子问题,但都很好。所以最好一个接一个地讲,我会尽力解释,这可能会帮助你解决你的问题

第一个规格ts

 it('promise chain 1', function () {
        /* Prints the following:
        [TRACE] default - Start
        [DEBUG] default - Sleeping for 100 ms...
        [TRACE] default - End
        [INFO] default - --1
        [DEBUG] default - Sleeping for 200 ms...
        [INFO] default - --2
        [DEBUG] default - Sleeping for 300 ms...
        [INFO] default - --3
        [INFO] default - --done
        */
        logger.trace("Start");

        printLater("--1", 100).then(() => {
            printLater("--2", 200).then(() => {
                printLater("--3", 300).thenFinally(() => {
                    logger.info("--done");
                });
            });
        });

        logger.trace("End");
    });
  • 这个很直截了当。printLater返回promise browser.sleep,因此它必须等待给定的时间,然后才能解析。这意味着每一个printLater都必须在进入下一个之前完成。我希望您对这个It块没有疑问

    it('承诺链1.1',功能(){ /*打印以下内容: [跟踪]默认-启动 [调试]默认-睡眠100毫秒。。。 [跟踪]默认-结束 [信息]默认值----1 */ logger.trace(“启动”)

在本例中,nativePromise创建Promise对象并稍后在其中调用print。让我解释一下流是如何发生的。 调用函数nativePromise时,它直接返回当前处于默认挂起状态的promise对象(因为任何promise对象都有三种状态:resolve/reject/pending).现在在nativePromise上使用then时,期望处于resolve/reject状态,但在测试超时之前,它会无限期地保持挂起状态。这就是测试在某个点命中并且没有执行任何操作的原因。最后一点是,由于异步行为,我们得到了first nativePromise的一些输出。因为有printLater函数可以工作异步并记录其结果

使其与第一个it块相同的简单方法是稍微更改nativePromise函数。您必须使用resolve来确保此承诺得到解决

function nativePromise(msg, time) {
        return new Promise((resolve) => {
            resolve(printLater(msg, time));
        });
    }
注意:解决/拒绝承诺始终是最佳实践。

it('await promise 3.1', async function () {
        /* Prints the following:
        [TRACE] default - Start
        [DEBUG] default - Sleeping for 100 ms...
        [INFO] default - --1
        */
        await logger.trace("Start");

        await nativePromise("--1", 100);
        await nativePromise("--2", 200);   // Gets stuck after "--1"
        await nativePromise("--3", 300);
        await logger.info("--done");

        await logger.trace("End");
    });
对于前面的代码段,原因与我前面提到的相同。wait也会等待承诺来解决/拒绝。如果它不返回任何内容,那么wait也会在某一点上卡住

我们使用wait使代码更干净。在内部,它还等待承诺解析/拒绝,并且不返回承诺对象。wait从承诺对象中获取值并返回

注1:expect from Jasmine在执行任何进一步的操作之前会等待控件流为空


注2:实际上是webdriver的量角器Promise。Promise在量角器和WebDriverJ中不推荐使用。因此,如果可能的话,请不要使用它们。

感谢@nitin sahu的快速回复!没错,我忘记添加resolve/reject调用。另外,我忘了添加对量角器提供给它的done()方法的调用()。添加这些修复后,代码工作得更好(请参阅我的git repo中的commit#5),但我仍然不明白为什么second_spec.ts中的expect()调用没有立即停止测试-我仍然看到expect()之后的print语句。同样在first_spec.ts中,为什么测试1.1的一些输出会溢出到测试1.2中,而2.1会溢出到测试2.2中?好的,我修复了commit 6中的所有承诺测试。我认为Javascript隐式返回函数中的最后一条语句,但看起来我必须为then()中的所有承诺显式添加返回语句它仍然不会在遇到失败的expect()语句时立即停止测试,但不幸的是,Jasmine就是这样工作的?
function nativePromise(msg, time) {
        return new Promise((resolve) => {
            resolve(printLater(msg, time));
        });
    }
it('await promise 3.1', async function () {
        /* Prints the following:
        [TRACE] default - Start
        [DEBUG] default - Sleeping for 100 ms...
        [INFO] default - --1
        */
        await logger.trace("Start");

        await nativePromise("--1", 100);
        await nativePromise("--2", 200);   // Gets stuck after "--1"
        await nativePromise("--3", 300);
        await logger.info("--done");

        await logger.trace("End");
    });