Цепные обещания в Promise.all без оболочки Обещание - PullRequest
0 голосов
/ 14 января 2019

Может ли Promise.all вернуть последнее значение цепочки без обещания обертки?

Без использования await это не работает в моем контексте

Без примера оболочки:

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),3000)
  })
}
const p1 = sum1(1);

p1
.then(sum1)
.then(sum1)

Promise.all([p1])
.then(v => console.log(v[0]));

В нем записывается 2 вместо ожидаемых 4.

Но если я использую обертку, она работает:

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),3000)
  })
}

function sum3(x){
  return sum1(x)
  .then(sum1)
  .then(sum1)
}
const p2 = sum3(1);

Promise.all([p2])
.then(v => console.log(v[0]));

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

Возможно ли это?

Ответы [ 4 ]

0 голосов
/ 14 января 2019

Как насчет создания новой функции для выполнения вашей задачи, похоже, что promise.all не подходит для вашего случая

const runInWaterfall = (promises) => new Promise((resolve, reject) => {
    const result = promises.reduce((acc, curr, index) => {
        if(!acc) {
            return curr();
        }
        return acc.then(curr);
    }, null);
    result.then(resolve).catch(reject);
})

и ваша задача может быть переписана следующим образом

runInWaterfall([() => Promise.resolve(1), sum1, sum1, sum1]).then(result => console.log(result))
0 голосов
/ 14 января 2019

На самом деле все, что мне нужно было сделать, это вызвать цепочку в объявлении переменной, поэтому она ссылается на последнее вызванное обещание

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),3000)
  })
}

//The change is here
const p1 = sum1(1)
.then(sum1)
.then(sum1)

Promise.all([p1])
.then(v => console.log(v[0]));
0 голосов
/ 14 января 2019

Вы можете сохранить значение, возвращаемое p1.then(sum1).then(sum1), и вызвать Promise.all для этого значения. Ожидается разрешение цепочки обещаний не только первой. Вот пример:

function sum1(x) {
  return new Promise(resolve => {
    setTimeout(t => resolve(x + 1), 10);
  });
}

const p1 = sum1(1);
const p2 = p1.then(sum1).then(sum1);

Promise.all([p1]).then(v => console.log('P1', v[0]));
Promise.all([p2]).then(v => console.log('P2', v[0]));
0 голосов
/ 14 января 2019

Объяснение: проблема с вашим кодом заключалась в том, что вы сохраняете в const p1 = sum1(1); только первую часть цепочки, а в Promise.all([p1]) вы получаете результат только из этой первой части (одно решение - просто сохранить всю цепочку в p1, как это : p1=sum1(1).then(sum1).then(sum1). Однако в вашем случае вам вообще не нужно использовать Promie.all (потому что в вашем примере есть только одно обещание p1 / 2):

function sum1(x){
  return new Promise(resolve => {
    setTimeout(t => resolve(x+1),300)
  })
}

// Promise.all([sum1(1).then(sum1).then(sum1)]).then(r => console.log(r)); // this works too

sum1(1).then(sum1).then(sum1).then(r => console.log(r));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...