我一直在读回调地狱,上面写着:
对于回调,最流行的处理错误的方式是Node.js风格,其中回调的第一个参数总是为错误保留。
并给出了这个例子:
var fs = require('fs')
fs.readFile('/Does/not/exist', handleFile)
function handleFile (error, file) {
if (error) return console.error('Uhoh, there was an error', error)
// otherwise, continue on and use `file` in your code
}
我的函数看起来不一样,像这样
function example (varA, varB){
//...
try{
//...
}catch {
//...
}
}
,其中varA和varB是变量/参数,用于在函数内部执行操作。现在,如果我将代码更改为function example (error, varA, varB)
,我将如何传递变量,因为第一个预期参数实际上是一个错误。
如果有人能提供一个例子或/并提供一些好的阅读,将是非常受欢迎的。
谢谢
现在,如果我将代码更改为函数示例(error, varA, varB),我将如何传递变量…
我假设你的意思是你正在编写一个API,它将接受带有这种签名的回调函数。如果是这样,在成功时使用null
作为第一个参数调用它,因为这是这些回调风格api中的惯例。(如果失败,你调用它的第一个参数是错误,通常没有其他参数)
// Your API function
function doSomething(param, callback) {
// There's no point to this style unless the work is asynchronous, so:
setTimeout(() => {
if (param.includes("good")) {
// Success
callback(null, 1, 2);
} else {
// Error
callback(new Error(`Using param ${param} failed`));
}
}, 100);
}
// The callback we'll use
const fn = (error, x, y) => {
if (error) {
console.error(error);
} else {
console.log(`x: ${x}, y: ${y}`);
}
};
// Example of successful call:
doSomething("good", fn);
// Example of unsuccessful call:
doSomething("bad", fn);
但是这种异步回调风格的api已经过时了。相反,使用承诺,直接或间接地通过async
函数。
// Your API function
function doSomething(param, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (param.includes("good")) {
// Success
resolve([1, 2]);
} else {
// Error
reject(new Error(`Using param ${param} failed`));
}
}, 100);
});
}
// The fulfillment and rejection callbacks we'll use
const onFulfilled = ([x, y]) => {
console.log(`x: ${x}, y: ${y}`);
};
const onRejected = (reason) => {
console.error(reason);
};
// Example of successful call:
doSomething("good").then(onFulfilled, onRejected);
// Example of unsuccessful call:
doSomething("bad").then(onFulfilled, onRejected);
// Examples in an `async` function instead of `onFulfilled`/`onRejected`
async function usingApi(param) {
try {
const [x, y] = await doSomething(param);
console.log(`x: ${x}, y: ${y}`);
} catch (error) {
console.error(error);
}
}
setTimeout(() => { // Just so we know the earlier examples have finished
usingApi("good").then(() => usingApi("bad"));
}, 400);
.as-console-wrapper {
max-height: 100% !important;
}
这取决于你想要什么
- 有人调用你的函数。函数可以返回同步结果-这里不需要错误。(回调上下文)。如果你的函数是异步的,那么你请求cb函数作为最后一个参数
function example (varA, varB, cb){
//...
try{
cb(null, varA+varB)
}catch (e) {
cb(e, null)
}
}
在这种情况下,你把错误传递给调用代码,因为这是一个共同的契约。
对于回调,最流行的处理错误的方式是Node.js风格,其中回调的第一个参数总是为错误保留。
example(1, 2, (err, result) => {
if (err) {}
else {
result is valid
}
})
- 我们示例中的函数只是普通函数=>没有必要使用err参数。
Callback用于异步操作。这些操作可以用error结束,第一个err参数是表示"我们有问题"的常用方式