обещаю подождать, чтобы начать другую функцию - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть функция, которая выполняется по обещанию, и я хочу, чтобы разрешено другое обещание функции.Но я не мог этого сделать.Ниже приведена функция моего обещания

var promise1
  $(document).ready(function() {
    promise1 = new Promise(function(resolve, reject) {
     getData(url).then(function(data) {
       // do something
     })
    })
  })

Теперь на той же странице в другой веб-части мы хотим запустить другую функцию, но только после завершения указанной выше функции

  $(document).ready(function() {
promise1.then(function(d) {
      var commentURL ="https://xxxx"
      loadComments(commentURL)
    })
})

, но вторая функция никогда не запускается, пожалуйстапомоги мне

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Не создавайте обещание с помощью new Promise, когда вы уже получаете обещание от вызова функции, как в случае с getData.Заключение в обратный вызов new Promise называется антипаттерном конструктора Promise .Постарайтесь избежать этого.

Сделайте это так:

var promise1;
$(document).ready(function() {
    promise1 = getData(url).then(function(data) {
        // If you want to pass something on to the next `then`, then return it here:
        return someData;
    });
});

Другая часть может остаться такой же, как у вас:

$(document).ready(function() {
     promise1.then(function(d) {
        var commentURL ="https://xxxx"
        loadComments(commentURL)
    });
});

Это может работать, только если promise1 был инициализирован первым блоком кода.Если по какой-либо причине кодовые блоки выполняются в обратном порядке, и вы не можете изменить этот порядок, оберните разрешающее обещание во второй кодовый блок, например:

$(document).ready(function() {
     Promise.resolve().then(function () {
         return promise1;
     }).then(function(d) {
         var commentURL ="https://xxxx"
         loadComments(commentURL)
     });
});
0 голосов
/ 26 ноября 2018

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

Но отвечая на ваш настоящий вопрос: вы 'Я должен был создать обещание немедленно, а не в ready обратном вызове, но разрешить его в ready обратном вызове.

Если , вам придется ждать ready перед вызовомgetData, тогда это одна из редких ситуаций, в которых имеет смысл использовать new Promise, даже если вы уже получили обещание от getData (из-за временной задержки вам нужно немедленное обещание, но вы хотите подождатьдля вызова getData):

var promise1 = new Promise(function(resolve, reject) {
  $(document).ready(function() {
     getData(url).then(resolve).catch(reject);
  });
});

Но , если только вам действительно не нужно ждать, пока ready позвонит getData, не надо (это не сразуимеет смысл подождать, чтобы получить некоторые данные, пока DOM страницы не будет завершен):

var promise1 = getData(url);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...