当前位置: 首页 > 面试题库 >

使用ES6 Promise惯用地处理前提条件

满子实
2023-03-14
问题内容

我是ES6
Promises的新手,并且一直在进行研究。我在NodeJS中执行了一些执行异步工作的代码,但是我有一些必须先检查的前提条件。我正在寻求处理这种情况(如果存在这种情况)以及一些推理的
惯用最佳实践 。我已经有了有效的代码,希望能对您有所了解。

考虑以下虚构的片段:

function doStuff(data, cb) {
     if (!data) {
         return cb(new Error("Don't be an idiot"));
     }

     externalLibrary.doSomethingCallbackAsync(data, cb);
}

如果我将其转换为承诺国,我看到两个选择。

选项1 ,我可以在promise中包含前提条件。

function doStuff(data){
    return new Promise((resolve, reject) => {
        if (!data) {
            return reject(new Error("Don't be an idiot"));
        }

        externalLibrary.doSomethingCallbackAsync(data, function(err, newData) {
            if (err) {
                return reject(err);
            }
            return resolve(newData);
        });
    });
}

选择2 ,我可以在承诺之前运行前提条件。我不确定我是否了解的意图Promise.reject(),但通过允许我返回立即被拒绝的诺言似乎符合要求。

function doStuff(data){
    if (!data) {
        return Promise.reject(new Error("Don't be an idiot"));
    }

    return new Promise((resolve, reject) => {
        externalLibrary.doSomethingCallbackAsync(data, function(err, newData) {
            if (err) {
                return reject(err);
            }
            return resolve(newData);
        });
    });
}

由于可读性的原因,我更喜欢 选项2 ,但是我不完全理解Promise.reject(),我担心 选项2
滥用了它。重申一下,我正在寻找最佳实践的解决方案。


问题答案:

我不确定我是否了解的意图Promise.reject(),但这似乎很合适

您已经正确理解了。它是针对此类用例而明确设计的。加油,这 最佳做法。

选项2的优点是,它与已经执行了返回诺言(认为return externalLibrary.doSomethingAsync(data))的API一起使用时更加清洁,并且使用Promise构造函数antipattern的机会更少。



 类似资料:
  • 我有一个包含许多字段的CSV文件。读取文件的惯用方法是什么,使用字段子集对文件进行排序,然后编写另一个CSV作为输出。 我是否应该尝试在Spring批处理中执行此操作?我知道基于*nix的操作系统具有实用程序来执行此操作,但如果可能,我希望将所有工作包含在Spring批处理中。 留档的批处理策略部分似乎建议这可能是实现此目的的标准实用程序步骤: 除了主要构建块之外,每个应用程序可以使用一个或多个标

  • 功能介绍 获取本APP使用习惯相关数据 接口 https://openapi.baidu.com/rest/2.0/mtj/svc/app/getDataByKey 请求参数 此处仅列本接口特有参数,公共参数请参考报告级API说明 获取表格数据 参数名 参数类型 是否必须 描述 method string 是 visit/character/a;visit/character/f metrics

  • 我是一个完整的打字初学者,我想知道是否有可能在打字中使用ES6promise,以及我必须做什么才能让他们工作。我正在运行节点0.11.14,在编译过程中得到一个错误“不能找到名称'promise'”

  • 问题内容: 为了使我的代码更“ Pythonic”且更快,我使用“multiprocessing”和一个map函数向其发送a)函数和b)迭代范围。 植入的解决方案(即直接在范围tqdm.tqdm(range(0,30))上调用tqdm不适用于多重处理(如以下代码中所述)。 进度条显示为0到100%(当python读取代码时?),但是它并不表示map函数的实际进度。 如何显示进度条以指示“地图”功能

  • 在Go中,复制切片是标准费用,如下所示: 在《铁锈》中,我找不到类似的替换方法。我想到的东西是这样的: 不幸的是,我遇到了无法解决的编译错误: 如何设置?有没有更好的复制切片的方法?

  • 本文向大家介绍iBatis习惯用的16条SQL语句,包括了iBatis习惯用的16条SQL语句的使用技巧和注意事项,需要的朋友参考一下 iBatis 简介: iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改