Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺/回调混合函数_Javascript_Promise_Callback - Fatal编程技术网

Javascript 承诺/回调混合函数

Javascript 承诺/回调混合函数,javascript,promise,callback,Javascript,Promise,Callback,我在玩弄承诺和回调,想知道如果没有回调被传递,写一个返回承诺的函数的正确方法是什么 我的结果是这样的,但我不确定这是否正确(在反模式的意义上) const mySuperFunction=函数mySuperFunction(数据,cb){ 让包装器=新承诺((解决、拒绝)=>{ 设置超时(()=>{ 如果(Math.random()>=0.5){ 解析(Date.now()); }否则{ 拒绝(新错误(“不是今天…”); } }, 100); }); 如果(cb){ 包装器。然后((结果)=>

我在玩弄承诺和回调,想知道如果没有回调被传递,写一个返回承诺的函数的正确方法是什么

我的结果是这样的,但我不确定这是否正确(在反模式的意义上)

const mySuperFunction=函数mySuperFunction(数据,cb){
让包装器=新承诺((解决、拒绝)=>{
设置超时(()=>{
如果(Math.random()>=0.5){
解析(Date.now());
}否则{
拒绝(新错误(“不是今天…”);
}
}, 100);
});
如果(cb){
包装器。然后((结果)=>{
cb(空,结果);
},(错误)=>{
cb(错误);
});
}否则{
返回包装器;
}
};
mySuperFunction()。然后((时间)=>{
console.log(时间)
}).catch((错误)=>{
控制台日志(err);
});
mySuperFunction(空,(错误,时间)=>{
console.log(错误,时间)
});
这样可以吗,还是我错过了一些特殊情况下,这不起作用

您的代码可以工作,但会增加无用的开销。承诺比回调占用更多内存,而且比回调慢

我会写这样的东西

const{promisify}=require('util'))
函数mySuperFunctionCallback(数据,cb){
设置超时(()=>{
如果(Math.random()>=0.5){
cb(Date.now())
}否则{
cb(新错误('不是今天…'))
}
}, 100)
}
const mysuperfunctionsync=promisify(mySuperFunctionCallback)
函数mySuperFunction(数据,cb){
如果(cb){
mySuperFunctionCallback(数据,cb)
}否则{
返回mySuperFunctionSync(数据)
}
}
mySuperFunction()。然后((时间)=>{
console.log(时间)
}).catch((错误)=>{
console.log(错误)
})
mySuperFunction(空,(错误,时间)=>{
console.log(错误,时间)
})

看起来不错。不过,我想把这些都转移到一个可重用的函数中。谢谢,但有一点我忘了提。当我可以直接将“extern”包装器/函数包含在函数中时,为什么要使用它?对我来说,你的例子比我的代码开销更大。我创建的2函数比你多。您正在为每个回调接口调用创建一个承诺:这是一个巨大的开销,如果您不信任我,您可能会用一个基准来误导它