Javascript Promise.all не показывать в прошлом - PullRequest
0 голосов
/ 02 июля 2018

У меня есть несколько функций, которые возвращают обещание.

Есть функция запуска, которая выполняет другую функцию.

Поскольку это обещания, и я использую Promise.all, теоретически, Promise.all должен отображаться только после того, как все остальные обещания будут выполнены.

Вот код:

arr = [];

function start() {
  var aPromiseMain = new Promise((resolve, reject) => {
    myfunction();
    arr.push('start');
    resolve(console.log('I am start'))
  })
  return aPromiseMain
}

start();

function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      arr.push('I am myfunction');
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
  return aPromise
}

Promise.all(arr).then(values => {
  console.log(values);
});

Вместо этого происходит следующее:

  1. Я начинаю
  2. Promise.all появляется
  3. Я myfunction

Должно быть:

  1. Я начинаю
  2. Я myfunction
  3. Promise.all

Как я могу это исправить?

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Исходя из описания и комментариев автора, похоже, что им может потребоваться выполнить обещания в серии, поэтому есть альтернатива:

arr = [];

function start() {
  console.log("I have started");
  var aPromiseMain = new Promise((resolve, reject) => {
    myfunction().then((result) => {
      console.log('I am finished');
    }); 
  })
  return aPromiseMain
}

function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
  return aPromise
}

start();
0 голосов
/ 02 июля 2018
function start() {
  return new Promise((resolve, reject) => {
    myfunction();
    arr.push('start');
    resolve(console.log('I am start'))
  })
}
function myfunction() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      arr.push('I am myfunction');
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
}
var arr = [start(), myfunction()]
Promise.all(arr).then(values => {
  console.log(values);
});

Попробуйте так.

0 голосов
/ 02 июля 2018

Ваш код arr.push('start'); (например) просто добавляет строку в массив. Promise.all нужен доступ к фактическим объектам Promise, а не к строкам. Он не может сделать ничего полезного со строками. Также не имеет смысла отправлять результат console.log в качестве значения в функции resolve - идея этого параметра состоит в том, чтобы вернуть слушателю некоторые данные в качестве результата - console.log регистрирует события, но не возвращает данные.

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

arr = [];


function start() {
  var aPromiseMain = new Promise((resolve, reject) => {
    console.log("start");
    myfunction();
    resolve('I am start');
  });
  arr.push(aPromiseMain);
  return;
}

start();


function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log("myfunction");
      resolve('I am myfunction');
    }, 2000)
  })
  arr.push(aPromise);
  return;
}

Promise.all(arr).then(values => {
  console.log(values);
});
0 голосов
/ 02 июля 2018

Ваш массив должен быть массивом обещаний , а не массивом строк.

arr = [];
    
    function start() {
        var aPromiseMain = new Promise((resolve, reject) => {
            resolve('I am start')
        })
        return aPromiseMain
    }
    
    function myfunction() {
        var aPromise = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve('I am myfunction')
            }, 2000)
        })
        return aPromise
    }
    
    arr.push(start());
    arr.push(myfunction());
    
    Promise.all(arr).then(values => {
        console.log(values);
        console.log("I am done");
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...