JavaScript обещание.all () - PullRequest
       3

JavaScript обещание.all ()

0 голосов
/ 10 октября 2019

У меня есть этот кусок кода.

function a() {
  var promise1 = Promise.resolve(3);
  var promise2 = 42;
  var promise3 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 2000, 'foo');
  });

  Promise.all([promise1, promise2, promise3]).then(function(values) {
    console.log("done", values);
  });
}

async function b() {
 await a(); 
}

b();
console.log("here")

Здесь мы получаем вывод

"здесь"

и затем через двасекунд, мы получаем

"done" Array [3, 42, "foo"]

Как изменить этот код так, чтобы внутри функции b () мыдействительно ожидают завершения () и затем продолжают выполнение кода?

Следовательно, я хочу получить вывод:

Подождите две секунды и увидите

"done" Array [3, 42, "foo"]

"here"

Ответы [ 4 ]

1 голос
/ 10 октября 2019

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

function a() {
  var promise1 = Promise.resolve(3);
  var promise2 = 42;
  var promise3 = new Promise(function(resolve, reject) {
    setTimeout(resolve, 2000, 'foo');
  });

  return Promise.all([promise1, promise2, promise3]).then(function(values) {
   return values;
  });
}

 function b() {
 a().then( function(res) {
  console.log("done", res);
  console.log("here")
 })
}

b();
1 голос
/ 10 октября 2019

Вы можете сделать это несколькими способами.

Форма 1

Во-первых, потому что a не возвращается, как указано @ chris-p-бекон, вместо обработки самого Обещания, вы можете вернуть его.

Вместо

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log("done", values);
});

использовать

return Promise.all([promise1, promise2, promise3]);

Форма 2

Другой способ - сделать функцию a async function, а затем ожидать Promise.all следующим образом:

async function a() {
  ...

  await Promise.all([promise1, promise2, promise3]);
}

Во второй формечем первая форма, вы все равно можете обработать Обещание после того, как оно вернется:

async function a() {
  ...

  var values = await Promise.all([promise1, promise2, promise3]);
  console.log("done", values);
}

Заключение

Обе формы отвечают на ваш запрос change ваш кусок кода, и он будет почти эквивалентен вашему коду. Но обратите внимание, что если бы вы использовали функцию catch, вам пришлось бы вместо этого использовать try-catch вокруг await.

1 голос
/ 10 октября 2019

b - асинхронная функция. Так что либо вы можете поставить await во время вызова, затем выполнить rest или выполнить .then, как

b().then(res => {
 //rest codes  
 console.log("here")
})

Кстати, не обязательно ставить await перед promise2, поскольку это даже не обещаниеобъект.

1 голос
/ 10 октября 2019

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

function a() {
    var promise1 = Promise.resolve(3);
    var promise2 = 42;
    var promise3 = new Promise(function (resolve, reject) {
        setTimeout(resolve, 2000, 'foo');
    });

    // Promise.all([promise1, promise2, promise3]).then(function (values) {
    //     console.log("done", values);
    // });

    return Promise.all([promise1, promise2, promise3]);
}

async function b() {
    let values = await a();
    console.log('done', values);
    // return values; // This will get automatically get wrapped into a promise.
    return Promise.resolve(values);
}

b().then(() => { console.log("here") });

Здесь a возвращает обещание, а после этого b также возвращает обещание, которое немедленно разрешается.

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