Javascript 带承诺的条件返回:抛出与返回null
我发现自己编写了很多Promise代码来处理数据可能不可用的情况,我不确定在这种情况下是传递null还是抛出/捕获 例如:Javascript 带承诺的条件返回:抛出与返回null,javascript,promise,Javascript,Promise,我发现自己编写了很多Promise代码来处理数据可能不可用的情况,我不确定在这种情况下是传递null还是抛出/捕获 例如: users.getById(id).then((user) => { if (!user) { return null; } return doSomething(user); }); 可以写成 users.getById(id).then((user) => { return doSomething(user); }).catch((
users.getById(id).then((user) => {
if (!user) {
return null;
}
return doSomething(user);
});
可以写成
users.getById(id).then((user) => {
return doSomething(user);
}).catch((e) => {
// User wasn't found
});
这两种方法中的任何一种都是比较可取的,或者在某种程度上是惯用的,或者在每种情况下都最好遵循我的直觉?如果一个函数被调用为
users.getById
,那么它的回调应该有一个user对象period。只有在实际获得用户对象时,才能实现获得用户对象的承诺
抛出以指示各种错误条件
users.getById(id).then((user) => {
return doSomething(user);
}).catch((e) => {
switch (e.Name) {
case "UserNotFound":
// User wasn't found
break;
default:
// unexpected error
}
});
bluebird
promise库有两个独立的函数,您可以模拟这种行为。或者你可以用蓝鸟:
users.getById(id).then((user) => {
return doSomething(user);
}).error(UserNotFound, (e) => {
// User wasn't found
}).catch((e) => {
// unexpected error
});
如果这是一个API调用,通常,您希望为使用者保存抛出部分,而不是在内部处理它 …或在内部处理转换为JSON部分,但如果存在加载错误或转换错误,请让外部世界使用oops 这就是我的意思;我们暂时跳过承诺:
function getData () {
var data = null;
try {
data = getSomeData();
} catch (e) { } // ignore it
return data;
}
var data = getData();
var name = data.property.name; // BOOM
如果它要扔,你应该抓住它(如果它不扔会更好,但知道它要扔比不知道要好)
当然,一般来说,投掷并不伟大。也不是null,这取决于您对函数式编程的立场
如果我们打了一个回复承诺的电话:
function getData () {
return callServer()
.then( response => JSON.parse(response) );
}
getData()
.then(showData)
.catch(showError);
如果该错误是在内部处理的,那么最终用户永远无法处理他们的东西丢失的事实。如果您返回null,那么他们必须执行各种
null
-检查他们的内部,然后()
第二个看起来更漂亮
function getData () {
return callServer()
.then( response => JSON.parse(response) );
}
getData()
.then(showData)
.catch(showError);