您的一个问题包含许多子问题,但都很好。所以最好一个一个去,我会尽力解释,这可能会帮助你解决你的问题。
first_spec.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('承诺链 1.1', function () {
/* 打印以下内容:
[TRACE] 默认 - 开始
[DEBUG] 默认 - 休眠 100 毫秒...
[TRACE] 默认 - 结束
[信息] 默认 - --1
*/
logger.trace("开始");
nativePromise("--1", 100).then(() => {
nativePromise("--2", 200).then(() => {
nativePromise("--3", 300).finally(() => {
logger.info("--done");
});
});
});
logger.trace("End");
});
在这种情况下,nativePromise 创建 Promise 对象并在其中调用 printLater。让我解释一下流程是如何发生的。
当我们调用函数nativePromise时,它直接返回当前处于默认挂起状态的promise对象(因为任何promise对象resolve/reject/pending都有三种状态)。现在在nativePromise上使用then期望resolve/reject状态但它仍然处于待定状态无限期直到测试超时。这就是测试在某一点发生并且不做任何事情的原因。最后一点是,由于异步行为,我们得到了第一个 nativePromise 的一些输出。因为有 printLater 函数异步工作并记录其结果。
使其与第一次阻塞相同的简单方法是对 nativePromise 函数进行轻微更改。你必须使用 resolve 来确保这个 Promise 被解决。
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");
});
对于前面的代码 sn -p 原因与我之前提到的相同。 await 还等待承诺解决/拒绝。如果它没有返回任何东西,那么 await 也会在某一时刻卡住。
我们使用 await 来使代码更简洁。在内部它也等待承诺解决/拒绝并且它不返回承诺对象。 await 从 promise 对象中取出值并返回。
注意1:来自 Jasmine 的期望在执行任何进一步操作之前等待控制流清空refer this link from Protractor
NOte2:Protractor Promise 实际上是 webdriver.Promise 在 Protractor 和 webdriverJs 中已被弃用。所以如果可能的话不要使用它们。