我有一个文件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中,但是开始变得难以遵循。
我怎么不能立即调用此函数?
答案 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>