Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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 带承诺的条件返回:抛出与返回null_Javascript_Promise - Fatal编程技术网

Javascript 带承诺的条件返回:抛出与返回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((

我发现自己编写了很多Promise代码来处理数据可能不可用的情况,我不确定在这种情况下是传递null还是抛出/捕获

例如:

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);