Присвоение функции переменной без вызова - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть файл myClass.js, в котором есть класс с функцией.

class MyClass {
    func1(param1, param2) {
        return new Promise((resolve, reject) => {
            resolve(param1+param2);
        })
    }
} 

const myObj = new MyClass();

module.exports = myObj;

Затем я вызываю эту функцию из другого файла и передаю ее через Promise.all.

const myObj = require('myClass.js') 
let funcPromise1 = myObj.func1(1, 2);
let funcPromise2 = myObj.func1(2, 3);
let funcPromise3 = myObj.func1(3, 4);

Promise.all([funcPromise1, funcPromise2, funcPromise3])
    .then(values=> {
        console.log(values)
    });

Проблема в том, что func1 вызывается, когда я присваиваю его переменной. Я мог бы обернуть его в другое обещание, но это похоже на анти-шаблон.

let funcPromise1 = new Promise((resolve, reject) => { myObj.func1(1, 2).then(sum=>{resolve(sum)}).catch(err=>{reject(err)});

Я мог бы просто поместить функцию в обещание всем, но ей стало трудно следовать.

Как я не могу вызвать эту функцию сразу?

1 Ответ

0 голосов
/ 26 апреля 2019

Обещания выполняются немедленно

Однако вы можете просто обернуть обещания в другую функцию, которую вы можете явно вызывать только тогда, когда вы хотите, чтобы они выполнялись. В следующем примере ваш myObj.func1 вызывается рано, но фактические обещания откладываются до тех пор, пока не будет нажата кнопка.

class MyClass {
  func1(param1, param2) {
    return () => new Promise((resolve, reject) => {
      console.log('executed', param1, param2);
      resolve(param1 + param2);
    })
  }
}

const myObj = new MyClass();
let funcPromise1 = myObj.func1(1, 2);
let funcPromise2 = myObj.func1(2, 3);
let funcPromise3 = myObj.func1(3, 4);

document.getElementById("btn").addEventListener('click', () => {
  Promise.all([funcPromise1(), funcPromise2(), funcPromise3()])
    .then(values => {
      console.log(values)
    });
});
<button id="btn">Go</button>

Более сложный подход состоит в том, чтобы обернуть каждое обещание func1 другим обещанием, которое будет вызывать func1 только тогда, когда какое-то другое обещание будет выполнено. По сути, это то же самое, что и первое решение (оба являются просто способом отложить вызов на new Promise внутри func1), но это может быть предпочтительнее в вашей ситуации, потому что func1 не меняется и вызов на Promise.all не изменяется, только инициализация переменных funcPromise<em>N</em>.

class MyClass {
  func1(param1, param2) {
    return new Promise((resolve, reject) => {
      console.log('executed', param1, param2);
      resolve(param1 + param2);
    })
  }
}

const clicked = new Promise(res => {
  document.getElementById("btn").addEventListener('click', () => res());
});
const delayed = (p, fn, ...args) => p.then(() => fn(...args));

const myObj = new MyClass();
let funcPromise1 = delayed(clicked, myObj.func1, 1, 2);
let funcPromise2 = delayed(clicked, myObj.func1, 2, 3);
let funcPromise3 = delayed(clicked, myObj.func1, 3, 4);


clicked
  .then(() => Promise.all([funcPromise1, funcPromise2, funcPromise3]))
  .then(values => {
    console.log(values)
  });
<button id="btn">Go</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...