我在玩弄promise和回调,想知道如果没有回调传递,那么编写一个返回promise的函数的正确方法是什么。
我的结果看起来像这样,但是我不确定这是否正确(在反模式的意义上)。
const mySuperFunction = function mySuperFunction(data, cb) {
let wrapper = new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() >= 0.5) {
resolve(Date.now());
} else {
reject(new Error("Not today..."));
}
}, 100);
});
if (cb) {
wrapper.then((result) => {
cb(null, result);
}, (error) => {
cb(error);
});
} else {
return wrapper;
}
};
mySuperFunction().then((time) => {
console.log(time)
}).catch((err) => {
console.log(err);
});
mySuperFunction(null, (err, time) => {
console.log(err, time)
});
它很简单:创建一个函数,并将“工作”代码包装在一个promise中。如果没有回调传递给我的函数,我将返回包装好的promise。如果传递了一个回调,我会从.then(...)和.catch(...)包装/调用它
这样可以吗,或者我错过了一些特殊的情况,这是不是不起作用?
发布于 2020-09-18 22:58:31
这样可以吗,或者我错过了一些特殊情况,在这些情况下,这种方法不起作用?
您的代码可以工作,但它增加了无用的开销。promise比回调消耗更多的内存,而且比回调慢。
我会写下这样的东西
const { promisify } = require('util')
function mySuperFunctionCallback (data, cb) {
setTimeout(() => {
if (Math.random() >= 0.5) {
cb(Date.now())
} else {
cb(new Error('Not today...'))
}
}, 100)
}
const mySuperFunctionAsync = promisify(mySuperFunctionCallback)
function mySuperFunction (data, cb) {
if (cb) {
mySuperFunctionCallback(data, cb)
} else {
return mySuperFunctionAsync(data)
}
}
mySuperFunction().then((time) => {
console.log(time)
}).catch((err) => {
console.log(err)
})
mySuperFunction(null, (err, time) => {
console.log(err, time)
})https://stackoverflow.com/questions/63952807
复制相似问题