【问题标题】:Creating JavaScript API for first time第一次创建 JavaScript API
【发布时间】:2012-12-12 17:07:41
【问题描述】:

我首次为响应式网页/网络应用程序(移动设备)创建商业 API。

我是新手,可悲的是,我独自工作以及 Javascript 新手(长篇复杂的故事)。

我只是想知道业内人士是否可以就以下“获取”电话格式提供专业意见:

var getSample = function(params) {
    //Returns Object
    return $.ajax({ 
        url: URL + 'downloadQuadrat.php',
        type: 'GET',
        data: { 'projectID': params.pid, 'quadratID': params.qid },
        dataType: dataType
    });
}

函数调用:

var printList = function(lid,options,get) {
    var list = $("ul#"+lid);
    var promise = get(options);

    promise.promise().then(
        function(response) {
            var items = response;
            list.empty();

            $.each(items, function(item,details) {
                var ul = $('<ul/>');
                ul.attr('id', lid+'_'+details.ID);
                var li = $('<li/>')
                .text(details.ID)
                .appendTo(list);
                ul.appendTo(list);

                $.each(details,function(key,value) {
                    var li = $('<li/>')
                    .text(key+': '+value)
                    .appendTo(ul);
                });
            });
        }
    );
}

我们将不胜感激任何意见或指导。

【问题讨论】:

  • 这种问题可能更适合http://codereview.stackexchange.com/
  • 谢谢,我一定会去看看
  • 除了 codereview 可能适用之外,您的代码确实存在问题。 getSample 使用异步 Ajax 调用,因此您无法从函数返回值。您需要引入一个回调函数作为参数或返回一个承诺对象。
  • 代码更新为包含“promise”

标签: javascript jquery api


【解决方案1】:

我不是该行业的专业人士,本身,但我认为有几件事可以改进您的代码:

  • 根据通用约定对其进行格式化。如果没有适当的缩进,很难看到您的代码在做什么。
  • 只需使用$("#"+lid) 而不是$("ul#"+lid)。开头的ul 没有添加任何歧义,因为id 属性必须是唯一的,它只会增加解析时间。
  • 在这种情况下放弃本地存储。并非所有浏览器都支持它,据我所知,您在这里不需要它。直接使用响应返回的数据即可。

我将如何更改您的代码:

var printList = function(lid, options, get) {
    var promise = get(options);
    var list = $("#" + lid);

    promise.success(function(response) {
        var data = response;
        list.empty();
        $.each(data, function(item, details) {
            var ul = $('<ul/>').attr('id', lid + '_' + details.ID);
            var li = $('<li/>').text(details.ID).appendTo(list);
            ul.appendTo(list);
            $.each(details, function(key, value) {
                var li = $('<li/>').text(key + ': ' + value).appendTo(ul);
            });
        });
    });
}

编辑:您的代码的编辑版本对我来说看起来不错,除了次要的 ul# 东西。

【讨论】:

  • 谢谢。我将进行建议的更改。 .promise().then() 和 .success() 在功能方面有什么真正的区别吗?或者两者都可以做到这一点?
  • 有区别,但在这种情况下,我认为它们在功能上是相同的。
【解决方案2】:

还有一些建议可以让您的 API 看起来更专业:

1 - 命名空间

使用命名空间将代码整齐地打包在自己的空间中,不会与页面上的其他函数定义发生冲突。像这样开始:

window.MyNamespace =  {};
MyNamespace.get = function(qid, pid) {
   //things
};
MyNamespace.anotherFunction = function() {
   //other stuff
}

如果您的代码开始变大,您可以将整个代码封装在一个闭包中。您也可以将其全部定义为类,然后将其实例化一次,以使您的代码更整洁,并允许您存储实例变量并调用 this.anotherFunction()。如果您愿意,我也可以提供这些示例。

2 - API 方法签名

我更喜欢看到的另一件事是函数的显式参数,而不是函数 get(params) 样式代码。使参数显式使您的代码更易于阅读和理解,并阻止临时黑客攻击,这在编写 API 时尤其重要。这是一个例子,因为你可以并不意味着你应该。

3 - 配置

尝试将诸如 ID 和 URL 之类的内容移到变量中,以使您的代码更易于重用和使用。

通常,Javascript 开发人员以在查看您的 API 文档之前先查看您的代码而闻名,因此您可以采取任何措施来使 API 函数名称和参数名称更具表现力和自文档化对他们有所帮助。

【讨论】:

  • 1 - 在编辑 OP 之前,我实际上有命名空间。然而,在我制定一个可靠的结构以允许歧义时,我暂时不赞成使用它们。 2 - 如上所述,这些特定的 get 方法被不明确地调用。我认为硬输入参数会使在像 printList() 3 这样的 UI 调用中使用委托变得困难 - 您将在 $.ajax url 属性中看到一个“URL”变量,这是一个设置在范围之外的配置变量。我会仔细考虑硬输入参数的想法,并尝试找到一种优雅的方式来重新引入命名空间:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
相关资源
最近更新 更多