Функция ожидания, которая имеет метод обещания - PullRequest
0 голосов
/ 09 февраля 2020

Я хочу подождать constructor (), у которого есть метод asyn c, обработанный Promise

Что я хочу сделать, это подождать два асин * метода c в конструкторе, а затем дождаться самого конструктора.

Однако мой код показывает ошибку Uncaught (in promise) ReferenceError: resolve is not defined

Каковы наилучшие методы для этой цели ??

class MyClass{
    constructor(){

        var p1 = new Promise(function(resolve, reject){
            $.ajax({
                type: "GET",
                url: api1
                success: function(response) {
                    console.log(response);
                    resolve();
                }
            });
        });
        var p2 = new Promise(function(resolve, reject){
            $.ajax({
                type: "GET",
                url: api2
                success: function(response) {
                    console.log(response);
                    resolve();
                }
            });
        });
        Promise.all([p1,p2]).then(function(value){
            console.log("finish");
            resolve(); // this shows error.
        });
    }    
}

$(function() {
    var temp = new Promise(function(resolve,reject){
        var myClass = new MyClass();
    });
    temp.then(function (value) {
        console.log("finish all");
    });
}

1 Ответ

1 голос
/ 09 февраля 2020

Конструктор всегда будет работать синхронно. В дополнение к этому вам не нужен явный анти-шаблон конструкции Promise, поэтому вы все равно не захотите вызывать resolve внутри Promise.all. Promise.all([p1,p2]) будет обещанием, которое разрешается, когда разрешены и p1, и p2, поэтому присвойте это свойство экземпляру и вызовите .then для этого свойства. Измените

Promise.all([p1,p2]).then(function(value){
  // ...
});

на

this.apiPromises = Promise.all([p1,p2]);

и, при создании экземпляра:

$(function() {
    const myInstance = new MyClass();
    myInstance.apiPromises
    .then(function (value) {
        console.log("finish all");
    })
    .catch((error) => {
        // handle errors
    });
});

(Если вы не вызываете ни один из resolve s с чем-либо в p1 или p2, лучше всего удалить параметр value, так как он не содержит никакой полезной информации)

$.ajax возвращает уже доступное значение, поэтому вам не нужно вызывать new Promise при создании p1 и p2 s:

var p1 = $.ajax({
  type: "GET",
  url: api1, // remember to put commas after values in an object to avoid a SyntaxError
  success: function(response) {
    console.log(response);
  }
});
var p2 = $.ajax({
  type: "GET",
  url: api2, // remember to put commas after values in an object to avoid a SyntaxError
  success: function(response) {
    console.log(response);
  }
});

(использование вышеуказанного также правильно отклонит Promise.all при возникновении ошибки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...