自定义ESLint规则中的异步代码

ale*_*cxe 14 javascript static-code-analysis protractor eslint

故事和动机:

我们有一个相当庞大的端到端Protractor测试代码库.有时,测试会等待实现特定修复 - 通常作为TDD方法的一部分,并演示如何重现问题以及预期的行为是什么.我们目前正在做的是使用pending()带有Jira问题编号的Jasmine's .例:

pending("Missing functionality (AP-1234)", function () {
    // some testing is done here
});
Run Code Online (Sandbox Code Playgroud)

现在,我们想知道我们什么时候可以重命名pending()it()和运行测试.或者,换句话说,当问题AP-1234得到解决或发送到测试时.

目前的方法:

目前,我试图用解决它自定义ESLint规则,jira的NodeJS模块,和Q.自定义ESLint规则搜索pending()至少包含一个参数的调用.AP-以4位数字的形式提取票号,并用于jira.findIssue()检查其在Jira中的状态.如果状态为Resolved- 报告错误.

这是我到目前为止所得到的:

"use strict";

var JiraApi = require("jira").JiraApi,
    Q = require('q');
var jira = new JiraApi("https",
    "jira.url.com",
    "443",
    "user",
    "password",
    "2");

module.exports = function (context) {
    var jiraTicketRegex = /AP\-\d+/g;

    return {
        CallExpression: function (node) {
            if (node.callee.name === "pending" && node.arguments.length > 0) {
                var match = node.arguments[0].value.match(jiraTicketRegex);

                if (match) {
                    match.forEach(function(ticket) {
                        console.log(ticket);  // I see the ticket numbers printed
                        getTicket(ticket).then(function (status) {
                            console.log(status);  // I don't see statuses printed
                            if (status === "Resolved") {
                                context.report(node, 'Ticket {{ticket}} is already resolved.', {
                                    ticket: ticket
                                })
                            }
                        });
                    });

                }
            }
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

在哪里getTicket()定义为:

function getTicket(ticket) {
    var deferred = Q.defer();

    jira.findIssue(ticket, function(error, issue) {
        if (error) {
            deferred.reject(new Error(error));
        } else {
            deferred.resolve(issue.fields.status.name);
        }
    });

    return deferred.promise;
}
Run Code Online (Sandbox Code Playgroud)

问题是:目前,它成功从pending()呼叫中提取票号,但不打印票证状态.虽然没有错误.

问题:

我想,一般的问题是:我可以使用异步代码块,等待回调,解决自定义ESLint规则中的承诺吗?如果没有,我的选择是什么?

一个更具体的问题是:我做错了什么以及如何使用Node.js jira模块ESLint

将不胜感激任何见解或替代方法.

Ily*_*din 6

简短的回答是 - 不,你不能在规则中使用异步代码.ESLint是同步的,并且EventEmitter在它走向AST时非常依赖.将ESLint代码修改为异步非常困难,但同时保证事件将以正确的顺序发出.我认为你唯一的选择可能是编写足够的信息输出到错误消息的同步规则,然后使用可解析格式化等中的一种JSONUNIX然后创建另一个应用程序,你可以管ESLint输出并以此为基础在吉拉一个异步查询在错误消息上.