我有以下代码在callbacks
中使用promises
:
const clue = 'someValue';
const myFunction = (someParam, callback) => {
someAsyncOperation(someParam) // this function returns an array
.then((array) => {
if (array.includes(clue)){
callback(null, array); // Callback with 'Success'
}
else{
callback(`The array does not includes: ${clue}`); // Callback with Error
}
})
.catch((err) => {
// handle error
callback(`Some error inside the promise chain: ${err}`) // Callback with Error
})
}
并这样称呼它:
myFunction (someParam, (error, response) => {
if(error) {
console.log(error);
}
else {
// do something with the 'response'
}
})
通过阅读一些文档,我发现有一些改进的方法可以做到这一点:
const myFunction = (someParam, callback) => {
someAsyncOperation(someParam) // this function returns an array
.then((array) => {
if (array.includes(clue)){
callback(array);
}
else{
callback(`The array does not includes: ${clue}`);
}
}, (e) => {
callback(`Some error happened inside the promise chain: ${e}`);
})
.catch((err) => {
// handle error
callback(`Some error happened with callbacks: ${err}`)
})
}
我的问题:
从性能或最佳实践的意义上讲,可以在诺言中调用'callback' function
,因为这两种方式都表明我做错了,我是说有些诺言是反模式的?
答案 0 :(得分:1)
这似乎倒退了,并且摆脱了承诺管理错误并将错误传递给链条的好处
从函数返回异步诺言,不要用回调中断它。然后在链的末尾添加一个鱼钩
const myFunction = (someParam) => {
// return the promise
return someAsyncOperation(someParam) // this function returns an array
.then((array) => {
return array.includes(clue) ? array : [];
});
}
myFunction(someParam).then(res=>{
if(res.length){
// do something with array
}else{
// no results
}
}).catch(err=>console.log('Something went wrong in chain above this'))
答案 1 :(得分:1)
请勿在promise中使用回调,这是一种反模式。一旦有了承诺,就可以使用它们。不要“取消承诺”将它们转换为回调-代码结构向后移动。取而代之的是,只返回承诺,然后可以使用.then()
处理程序来设置要解析的值,或者抛出错误来设置要拒绝的原因:
const clue = 'someValue';
const myFunction = (someParam) => {
return someAsyncOperation(someParam).then(array => {
if (!array.includes(clue)){
// reject promise
throw new Error(`The array does not include: ${clue}`);
}
return array;
});
}
然后,呼叫者只需执行以下操作:
myFunction(someData).then(array => {
// success
console.log(array);
}).catch(err => {
// handle error here which could be either your custom error
// or an error from someAsyncOperation()
console.log(err);
});
这给您带来的好处是,调用者可以使用promises的所有功能将这个异步操作与任何其他异步操作同步,轻松地将所有错误传播给一个错误处理程序,并与其一起使用await
,等等。