为何制作新的承诺?

时间:2017-08-29 09:41:42

标签: angular function asynchronous memory-management service

我关注的tutorial具有此功能(其中Hero是一个类,HEROES是一个数组):

@Injectable()
export class HeroService {
  getHeroes(): Promise<Hero[]> {
    return Promise.resolve(HEROES);
  }
}

现在它想要模拟慢速连接并定义:

getHeroesSlowly(): Promise<Hero[]> {
  return new Promise(resolve => {
    // Simulate server latency with 2 second delay
    setTimeout(() => resolve(this.getHeroes()), 2000);
  });
}

它使用new,但没有解释为什么它现在创建一个新的Promise,而它之前没有这样做。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

它返回一个新的Promise,以便模拟HttpServer调用,每次调用该方法时,这将是一个新调用。这通常需要时间。

如果我们不使用新承诺,先前的承诺将得到解决并立即返回值。

答案 1 :(得分:1)

已经定义了HEROES。数据可用,因此您可以立即返回:Promise.resolve(HEROES);

新的Promise用于在稍后阶段解析数据。 (在你的例子中2秒后)。

答案 2 :(得分:1)

他们只是使用Promise构造函数来定义特定的resolve()函数。这是JS中的样子:

return new Promise(function (resolve) {
    setTimeout(function () { return resolve(_this.nextQuote()); }, 500);
});

您还可以在ES6库中看到PromiseConstructor的定义:

interface PromiseConstructor {
    /**
     * A reference to the prototype.
     */
    readonly prototype: Promise<any>;

    /**
     * Creates a new Promise.
     * @param executor A callback used to initialize the promise. This callback is passed two arguments:
     * a resolve callback used resolve the promise with a value or the result of another promise,
     * and a reject callback used to reject the promise with a provided reason or error.
     */
    new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;

    ...
}