Promise.all игнорирует одно обещание и дважды вызывает другое - PullRequest
0 голосов
/ 26 июня 2019

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

const test = {};

test.ObjectOne = () => {
  aMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method one");
  });
  
  bMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method one two");
  });

  return this;
};

test.ObjectTwo = () => {
  aMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method two");
  });

  return this;
};

const objectOne = test.ObjectOne();
const objectTwo = test.ObjectTwo();

Promise.all([
  objectOne.aMethod(1, 2),
  objectOne.bMethod(1, 3),
  objectTwo.aMethod(1, 2),
]).then((responses) => {
  console.log(responses);
});

Я ожидаю, что результат будет:

["Method one", "Method one two", "Method two"]

Но фактический результат:

["Method two", "Method one two", "Method two"]

Что такоевопрос, который я вижу?

С наилучшими пожеланиями

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Вы не определяете свои объекты правильно.Это:

test.ObjectTwo = () => {
  aMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method two");
  });

  return this;
};

создает глобальную переменную aMethod (перезаписывает ранее определенный aMethod) и возвращает глобальный объект (window).

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

const test = {};

test.ObjectOne = () => ({
    aMethod: (paramOne, paramTwo) => new Promise((resolve, reject) => {
        resolve("Method one");
    }),
    bMethod: (paramOne, paramTwo) => new Promise((resolve, reject) => {
        resolve("Method one two");
    })
});

test.ObjectTwo = () => ({
    aMethod: (paramOne, paramTwo) => new Promise((resolve, reject) => {
        resolve("Method two");
    })
});

const objectOne = test.ObjectOne();
const objectTwo = test.ObjectTwo();

Promise.all([
    objectOne.aMethod(1, 2),
    objectOne.bMethod(1, 3),
    objectTwo.aMethod(1, 2),
]).then((responses) => {
    console.log(responses);
});
1 голос
/ 26 июня 2019

Или вы можете вызвать определенную функцию, вызвав метод обещания, чтобы не перезаписывать функции aMethod

const test = {};

test.ObjectOne = () => {
  aMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method one");
  });
  
  bMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method one two");
  });

  return this;
};

test.ObjectTwo = () => {
  aMethod = (paramOne, paramTwo) => new Promise((resolve, reject) => {
    resolve("Method two");
  });

  return this;
};

const objectOne = test.ObjectOne;
const objectTwo = test.ObjectTwo;

Promise.all([
  objectOne().aMethod(1, 2),
  objectOne().bMethod(1, 3),
  objectTwo().aMethod(1, 2),
]).then((responses) => {
  console.log(responses);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...