如何使用js Promise消除金字塔的厄运

Zalaboza

我试图了解如何使用js Promise api折射具有大量嵌套IF的代码。

从本地存储获取JSON对象时的示例

function $storage(key,default) {
  let json = localStorage.getItem(key);

  if(json === null) return default;

  try{  // <-- need try catch in case value was not valid json object
    json = JSON.parse(json); 
  } catch (e) {
    json = default;
  }
  return typeof json === 'object' ? json : default;
}

该代码的可读性不是很好。所以我想可能是我可以利用js Promise将其重写为

function $storage (key, default) {
 let ret;

 let promise = new Promise( (y,n) => y(localStorage) )
 .then( ls => JSON.parse(ls.getItem(key)) )
 .then( json => typeof json === 'object' ? json : HOW_TO_THROW_ERROR() )
 //on more validation step if needed
 .then( json => typeof json === 'object' ? json : HOW_TO_THROW_ERROR() )
 .then( valid_json => { return = valid_json } )
 .catch( error => { ret = default; console.warn('json invalid',e); } );

 return ret;

}

现在我想知道如何在内部抛出异常,以便catch可以捕获它并执行default?

这是JS的有效用法吗?我会浪费性能吗

费德里科

您可以使用Promise.reject()抛出错误:

function $storage (key, default) {
 let ret;

 let promise = new Promise( (y,n) => y(localStorage) )
 .then( ls => JSON.parse(ls.getItem(key)) )
 .then( json => typeof json === 'object' ? json : Promise.reject("invalid json") )
 .then( valid_json => { return = valid_json } )
 .catch( err => { ret = default; console.warn(err.message); } );

 return ret;

}

尽管我发现以下内容更容易理解和习惯。

function $storage(key,default) {
  let json = localStorage.getItem(key);
  if(json === null ||  typeof json !== 'object') json = default;

  try{  
    json = JSON.parse(json); 
  } catch (e) {
    json = default;
  } finally {
  return json
  }
}

如您所知,Promise用于异步计算。任何其他用途都可能使其他程序员感到困惑。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用jQuery Deferred(何时/那么等等)来解决厄运的异步金字塔问题

来自分类Dev

Node JS避免了金字塔的厄运,同时内存增加了

来自分类Dev

厄运金字塔

来自分类Dev

如何使用JavaScript显示金字塔?

来自分类Dev

如何使用JavaScript显示金字塔?

来自分类Dev

在HTML中绑定JS金字塔

来自分类Dev

如何用星号制作金字塔

来自分类Dev

如何重写金字塔的会话工厂?

来自分类Dev

如何从给定的数字制作金字塔?

来自分类Dev

在Highcharts中,如何为多金字塔图表中的每个金字塔设置标题

来自分类Dev

使用金字塔和ember.js路由SPA

来自分类Dev

如何在金字塔中使用外部Auth系统

来自分类Dev

如何使用Ajax调用金字塔视图

来自分类Dev

如何使用金字塔获取当前路线

来自分类Dev

如何在金字塔中使用pyramid_celery?

来自分类Dev

如何使用金字塔获取当前路线

来自分类Dev

Q.传播和金字塔的厄运

来自分类Dev

金字塔静态视图(js,img,css):AttributeError

来自分类Dev

如何为p5.js金字塔使用嵌套循环?

来自分类Dev

金字塔如何设置API中间件?

来自分类Dev

金字塔:如何自动生成站点地图?

来自分类Dev

如何在Python中简化循环金字塔?

来自分类Dev

这个C for循环如何打印文字艺术金字塔?

来自分类Dev

如何从JavaScript调用金字塔服务器

来自分类Dev

如何用python建立人口金字塔

来自分类Dev

如何在金字塔会话中存储值?

来自分类Dev

如何从JavaScript调用金字塔服务器

来自分类Dev

如何构建二维数组金字塔

来自分类Dev

如何在Javascript中显示金字塔?