Ожидание асинхронной функции в пределах обещания - PullRequest
0 голосов
/ 06 сентября 2018

Следующая ситуация:

function myFunction() {

      return new Promise(function (resolve, reject) {

          doSomething();
          let myVariable = doSomethingElse();

          let otherVariable = doOtherThings(myVariable);              

          return resolve(otherVariable);
      });
}

Теперь я хочу, чтобы myVariable инициализировался не вызовом функции, а внутри обратного вызова или, скорее, в .then обещания, возвращаемого асинхронной функцией.

function myFunction() {

      return new Promise(function (resolve, reject) {

          doSomething();
          let myVariable;

          asynchronousFunctionThatReturnsPromise().then(function(param) {
             myVariable = doSomethingElse(param);
          });

          let otherVariable = doOtherThings(myVariable);              

          return resolve(otherVariable);
      });
}

В идеале внешняя функция будет ждать, пока myVariable будет присвоено значение, пока она не выполнит doOtherThings(myVariable), но я думаю, что это невозможно в javascript.

К сожалению, я не могу просто поместить весь следующий код в функцию «обратного вызова», так как возвращаемые внешние функции зависят от результата.

Есть ли способ, которым я могу справиться с этим, в идеале без необходимости что-либо менять во внешней функции (myFunction)?

1 Ответ

0 голосов
/ 06 сентября 2018

Полностью избавьтесь от обертки обещаний. Это шаблон обещания , заключающий одно обещание в другое. Вместо этого просто верните тот, который у вас уже есть, и поместите свою логику в обработчик .then():

function myFunction() {
        doSomething();

        return asynchronousFunctionThatReturnsPromise().then(function(param) {
           let myVariable = doSomethingElse(param);
           let otherVariable = doOtherThings(myVariable);              
           return otherVariable;
        });
    });
}

Использование:

myFunction().then(val => {
   console.log(val);        // will be the value of otherVariable above
}).catch(err => {
   console.log(err);
});

К сожалению, я не могу просто поместить весь следующий код в функцию «обратного вызова», так как возвращаемые внешние функции зависят от результата.

Непонятно, что это значит. Вы должны изменить внешнюю функцию, чтобы правильно написать myFunction().

Есть ли способ, которым я могу справиться с этим, в идеале без необходимости что-либо менять во внешней функции (myFunction)?

Нет. Вы должны изменить myFunction, чтобы правильно написать код. Если у вас есть какая-то ситуация в реальном мире с некоторыми реальными ограничениями, вам придется опубликовать другой вопрос с этими фактическими данными и реальным кодом (не псевдокодом), чтобы мы могли дать вам более конкретные рекомендации.

...