Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
var async = require("async");
// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
// some asynchronous operation
$.ajax({
url: '...',
success: function(response) {
result.response = response;
_callback();
}
});
});
async.parallel(asyncTasks, function(){
// result is available after performing asynchronous operation
console.log(result)
console.log('Done');
});
Я использую объект result
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Используйте конструктор объекта RegExp для создания регулярного выражения из строки:
var re = new RegExp("a|b", "i");
// same as
var re = /a|b/i;
Вы можете запросить флаги с помощью флажков, а затем сделать что-то вроде этого:
var userInput = formInput;
var flags = '';
if(formGlobalCheckboxChecked) flags += 'g';
if(formCaseICheckboxChecked) flags += 'i';
var reg = new RegExp(userInput, flags);
Используйте конструктор объектов JavaScript RegExp .
var re = new RegExp("\\w+");
re.test("hello");
Вы можете передавать флаги в качестве второго строкового аргумента конструктору. Подробнее см. В документации.
Благодаря более ранним ответам этот блок служит также универсальным решением для применения настраиваемой строки в RegEx .. для фильтрации текста:
var permittedChars = '^a-z0-9 _,.?!@+<>';
permittedChars = '[' + permittedChars + ']';
var flags = 'gi';
var strFilterRegEx = new RegExp(permittedChars, flags);
log.debug ('strFilterRegEx: ' + strFilterRegEx);
strVal = strVal.replace(strFilterRegEx, '');
// this replaces hard code solt:
// strVal = strVal.replace(/[^a-z0-9 _,.?!@+]/ig, '');
Это будет работать также, если строка недействительна или не содержит флагов и т. д.:
function regExpFromString(q) {
let flags = q.replace(/.*\/([gimuy]*)$/, '$1');
if (flags === q) flags = '';
let pattern = (flags ? q.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1') : q);
try { return new RegExp(pattern, flags); } catch (e) { return null; }
}
console.log(regExpFromString('\\bword\\b'));
console.log(regExpFromString('\/\\bword\\b\/gi'));
var flags = inputstring.replace(/.*\/([gimy]*)$/, '$1');
var pattern = inputstring.replace(new RegExp('^/(.*?)/'+flags+'$'), '$1');
var regex = new RegExp(pattern, flags);
или
var match = inputstring.match(new RegExp('^/(.*?)/([gimy]*)$'));
// sanity check here
var regex = new RegExp(match[1], match[2]);
Вот однострочный: str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&')
Я получил его из модуля escape-string-regexp NPM.
Попробуйте :
escapeStringRegExp.matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
function escapeStringRegExp(str) {
return str.replace(escapeStringRegExp.matchOperatorsRe, '\\$&');
}
console.log(new RegExp(escapeStringRegExp('example.com')));
// => /example\.com/
В моем случае пользовательский ввод иногда окружен разделителями, а иногда и нет. поэтому я добавил другой случай ..
var regParts = inputstring.match(/^\/(.*?)\/([gim]*)$/);
if (regParts) {
// the parsed pattern had delimiters and modifiers. handle them.
var regexp = new RegExp(regParts[1], regParts[2]);
} else {
// we got pattern string without delimiters
var regexp = new RegExp(inputstring);
}
Предлагаю также добавить отдельные флажки или текстовое поле для специальных флагов. Таким образом, понятно, что пользователю не нужно добавлять никаких //
. В случае замены укажите два текстовых поля. Это сделает вашу жизнь намного легче.
Почему? Потому что в противном случае некоторые пользователи добавят //
, а другие - нет. И некоторые будут делать синтаксическую ошибку. Затем, после того, как вы разделили //
, вы можете получить синтаксически действующее регулярное выражение, которое не похоже на то, что предназначалось пользователю, что приводит к странному поведению (с точки зрения пользователя).