将函数分配给变量而不调用

时间:2019-04-26 16:50:17

标签: javascript ecmascript-6

我有一个文件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分配给变量时,它将被调用。 我可以将其包装在另一个Promise中,但这似乎是一种反模式。

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

我可以将函数放到promise all中,但是开始变得难以遵循。

我怎么不能立即调用此函数?

1 个答案:

答案 0 :(得分:0)

Promises are executed immediately

但是,您可以简单地将promise包装在另一个函数中,只有在您希望它们执行时才可以显式调用它们。在下面的示例中,您的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的调用不会更改,仅对funcPromiseN变量进行初始化。

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>