【问题标题】:Execute a promise until a condition is met (within a while loop)执行一个承诺,直到满足一个条件(在一个while循环内)
【发布时间】:2016-12-28 08:48:19
【问题描述】:

我想在一个while循环中封装一个promise,这样我的方法就会一直执行,直到满足一个条件。我试图实现这一点,但最终会生成无限的 Promise,直到发生堆栈溢出。

我想在 TypeScript 中实现如下内容:

while (responseSuccess === false) {
    myClass.executeScript.then((thisWasSuccessful: boolean) => {
         responseSuccess = thisWasSuccessful;
    });

我知道这有点不合常规,但我创建的脚本是应用程序正常执行的对服务器的请求。它并不总是第一次或 n 次返回成功(我无法更改)。

【问题讨论】:

  • while(!await myClass.executeScript()) ;?
  • 如果你使用then和回调,你需要使用递归的方式。

标签: typescript promise protractor


【解决方案1】:

好吧,我同意其他答案,使用 async/await 运算符实现这一点真的很容易。 Typescript 的最新稳定版本 2.1.4 已经可以将 async/await 代码转换为 ES5。

如果您真的需要仅使用标准 Promise 来执行此操作,也许这样就足够了?

this.executeAsync.then(() => {
  // after while loop code
});

private executeAsync(): Promise<void> {
  return new Promise((callback) => this.executeAsyncLoop(callback));
}

private executeAsyncLoop(callback: () => void): void {
  myClass.executeScript.then((thisWasSuccessful: boolean) => {
     if(!thisWasSuccessful) executeAsyncLoop(callback);
     else callback();
  });
}

我现在没有测试此代码的环境,所以如果它不起作用,我深表歉意。

【讨论】:

  • 当我实现这个时,它卡在了 myClass.executeScript() 并且在 .then() 之后再也没有执行任何东西
  • @fuzzii 好吧,很难知道会出现什么问题,因为这是您的脚本代码。如果这部分代码正在执行并且 then() 中的回调没有被调用,那么你的脚本可能有问题没有正确调用 promise 回调。你可以隔离这只是调用你的脚本并确保调用 then() 中的回调。
【解决方案2】:

尝试使用 await 运算符。

while (responseSuccess === false) {
  responseSuccess = await myClass.executeScript;
});

PS:你应该使用 TS 2.1 或更高版本来定位 ES5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2015-04-08
    • 1970-01-01
    • 2018-12-24
    • 2018-12-22
    • 2015-10-27
    • 2018-08-03
    • 2020-10-31
    相关资源
    最近更新 更多