Как разрешить Обещание только после изменения состояния - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь разрешить Обещание только после выполнения определенного условия вне обещания:

class myClass extends ... {

    render() {
       ...
       this.fetch();
       ....
    }

    fetch(){
        Promise.all([
          ....,
          ....,
          ....
        ]).then( () => {
          // new Promise or somthing like that
          // wait for state changed to resolve it
        }
        ).then(
          // do something
        )
    }

    stateChanged(state){
        if(condition){
           // resolve promise from here
        }
    }

}

Я пытался реализовать его аналогично этому вопросу Разрешить Javascript Promise вне области действия функции но я не понимаю

  1. , как мы можем вызвать переменную
  2. , как заставить это работать внутри моего класса, я попробовал это с переменной this.waitForPromise = null, но когда яПозвоните позже this.waitForPromise() Я получаю, это не функция Ошибка типа.
class myClass extends ... {

    render() {
       ...
       this.fetch();
       ....
    }

    constructor(){
        this._waitForPromise = null;
    }

    fetch(){
        Promise.all([
          ....,
          ....,
          ....
        ]).then( () => {
            new Promise(function(resolve, reject) { 
              this._waitForPromise = resolve; 
            });
        }
        ).then(
          // do something
        )
    }

    stateChanged(state){
        if(condition){
           this._waitForPromise();
        }
    }

}

Любая помощь и объяснение очень ценится.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

ОК, так что я не очень хорошо знаком с Polymer 3, но я хорошо разбираюсь в Polymer 1 и 2.

Я получаю, что вы хотите сделать это:

  1. Получите обещание ajax.

  2. Верните указанное обещание ajax, как только определенное состояние изменилось.

  3. сделайте выборкувызовите, если указанное обещание не было выполнено.

Вам нужно сохранить это обещание как переменную, а затем просто связать его вместе с другими вызовами методов.Комментарии ниже объясняют больше о том, что я делаю с вашим примером кода из OP.

class myClass extends ... {

render() {
   ...
   this.fetch();
   ....
}

fetch(){
    this.set('savedPromise', Promise.all([ // save promise to variable 
      ....,
      ....,
      ....
    ])
    // not needed
    /* .then( () => {
      // new Promise or somthing like that
      // wait for state changed to resolve it
    }*/
    ).then(
      // do something

      return result // added this line
    )
}

stateChanged(state){
    if(condition){
       if (this.savedPromise) {
         this.savedPromise.then(function(response) {
           // handle data
         });
       else {
         fetch().then(function(response) {  // if set before render(), do a fetch call.
           // handle data
         }
       }
    }
}

} ​​

0 голосов
/ 22 сентября 2019

У вас проблема с закрытием, используя this, поэтому сначала захватите ее.

Вы должны вернуть обещание в вашем then.

. Вы должны проверить, создано ли обещание.когда состояние меняется.

Имейте в виду, что вы можете вызвать только одно из решений / отклонить и только один раз.

class myClass extends ... {

    render() {
       ...
       this.fetch();
       ....
    }

    constructor(){
        this.resolve = null;
        this.state = null; // TODO initial state
    }

    fetch(){
        const that = this;
        Promise.all([
          ....,
          ....,
          ....
        ]).then( () => {
            return new Promise(function(resolve, reject) { 
              that.resolve = resolve;
              that.checkState();
            });
        }
        ).then(
          // do something
        )
    }

    checkState(){
      if(condition && this.resolve){
         this.resolve();
         this.resolve = null;  // set to null to ensure we don't call it again.
      }
    }

    stateChanged(state){
        this.state = state;
        this.checkState();
    }

}
...