Как связать обещания - PullRequest
       1

Как связать обещания

0 голосов
/ 25 декабря 2018

В этом упрощенном примере я вызываю три функции, когда первое обещание будет разрешено.

var test = new Promise(function (res, err) { setTimeout(res, 3000) })

test.then( () => { console.log("A") });
test.then( () => { 
    return new Promise(function(res, err) { 
        setTimeout(()=> { console.log("C"); 
        res() }, 3000) 
    }); 
});

test.then( () => { console.log("B") });

Результат, как и ожидалось, равен A B C.

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

Если я попытаюсь сохранить второе обещание (myProm) в глобальном масштабе и прикрепить к нему функцию .then, я получу (разумно) TypeError, потому что во время компиляции myProm все еще не определен.

var test = new Promise(function (res, err) { setTimeout(res, 3000) })
var myProm;

test.then( () => { console.log("A") });
test.then( () => { 
    myProm = new Promise(function(res, err) { 
        setTimeout(()=> { console.log("C"); 
        res() }, 3000) 
    })
    return myProm;
});

myProm.then( () => { console.log("B") });

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

В этом сценарии вывод, который я хотел быиметь будет A C B

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

then возвращает обещание, которое разрешается, когда указанная функция запущена, и возвращенное значение разрешено (это небольшое упрощение, но достаточное для задачи здесь).

Следовательно, чтобы связатьобещание по результатам then.Просто нажмите на другой .then:

var test = new Promise(function (res, err) { setTimeout(res, 3000) })

test.then( () => { console.log("A") });
test
    .then( () => { 
        return new Promise(function(res, err) { 
            setTimeout(()=> { console.log("C"); res() }, 3000);
        });
    })
    .then( () => { console.log("B") });
0 голосов
/ 25 декабря 2018

Каждый раз, когда вы звоните .then, вы создаете новый Promise, который разрешается, когда Promise, возвращаемый этим .then, разрешается.Вы должны присвоить результат myProm -содержащего .then переменной, а затем вызвать .then для этой переменной:

var test = new Promise(function (res, err) { setTimeout(res, 500) })
var myProm;

test.then( () => { console.log("A") })
  .then( () => { 
      myProm = new Promise(function(res, err) { 
          setTimeout(()=> { console.log("C"); 
          res() }, 500) 
      })
      return myProm;
  })
  .then( () => { console.log("B") });

Большую часть времени при использовании Promises вы должны соединять .then с таким образом.Делайте prom.then(...) ... prom.then(...) только если вы хотите инициализировать две полностью отдельных асинхронных операции, когда prom разрешается.

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