find /path -type f -exec grep -l "string" {} \;
Объяснение из комментариев
find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.
-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
Просто используйте функцию $ q.when ():
var items = ['one', 'two', 'three'];
var chain = $q.when();
items.forEach(function (el) {
chain = chain.then(foo(el));
});
return chain;
Примечание: foo должен быть фабрикой, например
function setTimeoutPromise(ms) {
var defer = $q.defer();
setTimeout(defer.resolve, ms);
return defer.promise;
}
function foo(item, ms) {
return function() {
return setTimeoutPromise(ms).then(function () {
console.log(item);
});
};
}
var items = ['one', 'two', 'three'];
var chain = $q.when();
items.forEach(function (el, i) {
chain = chain.then(foo(el, (items.length - i)*1000));
});
return chain;
Ваш ответ верный. Однако я подумал, что я бы предложил альтернативу. Вы можете быть заинтересованы в $ q.serial, если часто встречаетесь с обещаниями по цепочке.
var items = ['one', 'two', 'three'];
var tasks = items.map(function (el) {
return function () { foo(el, (items.length - i)*1000)); });
});
$q.serial(tasks);
function setTimeoutPromise(ms) {
var defer = $q.defer();
setTimeout(defer.resolve, ms);
return defer.promise;
}
function foo(item, ms) {
return function() {
return setTimeoutPromise(ms).then(function () {
console.log(item);
});
};
}
Возможно, проще, чем ответ redgeoff , если вы не нуждаетесь в нем автоматизированным способом, вы можете сцепить обещания с помощью $q.when()
в сочетании с .then()
, как показано в начале этот пост .
return $q.when()
.then(function(){ return promise1; })
.then(function(){ return promise2; });
Я предпочитаю готовить функции, которые возвращают обещания с использованием angular.bind
(или Function.prototype.bind
), а затем связывают их с цепочкой с помощью сокращения ярлыка. Например,
// getNumber resolves with given number
var get2 = getNumber.bind(null, 2);
var get3 = getNumber.bind(null, 3);
[get2, get3].reduce(function (chain, fn) {
return chain.then(fn);
}, $q.when())
.then(function (value) {
console.log('chain value =', value);
}).done();
// prints 3 (the last value)
angular.bind
в этом сценарии?
– pulkitsinghal
17 June 2015 в 16:01
.then(foo).then(bar)
– gleb bahmutov
18 June 2015 в 16:18
Имея это:
let items = ['one', 'two', 'three'];
Одна строка (ну, 3 для читаемости):
return items
.map(item => foo.bind(null, item))
.reduce($q.when, $q.resolve());
var when = $q.when();
for(var i = 0; i < 10; i++){
(function() {
chain = when.then(function() {
return $http.get('/data');
});
})(i);
}
Redgeoff, ваш собственный ответ - это способ, которым я использовал для перевести массив в цепочку цепочек обещаний.
Созданный шаблон de facto выглядит следующим образом:
function doAsyncSeries(arr) {
return arr.reduce(function (promise, item) {
return promise.then(function(result) {
return doSomethingAsync(result, item);
});
}, $q.when(initialValue));
}
//then
var items = ['x', 'y', 'z'];
doAsyncSeries(items).then(...);
Примечания:
.reduce
является необработанным javascript, а не частью библиотеки. result
is предыдущий асинхронный результат / данные и включен для полноты. Начальным result
является initialValue
. Если нет необходимости передавать «результат», то просто оставьте его. $q.when(initialValue)
в зависимости от того, какой обетованный lib вы используете. doSomethingAsync
есть foo
(или что возвращает foo ()?) - в любом случае, функция. Если вы похожи на меня, тогда картина будет выглядеть, на первый взгляд, как непроницаемая клаузула но как только ваш глаз будет настроен, вы начнете рассматривать его как старого друга.
Редактировать
Вот демон , предназначенный для демонстрации того, что шаблон, рекомендованный выше, фактически выполняет свои doSomethingAsync()
вызовы последовательно, а не сразу при создании как указано в комментариях ниже.
initialValue
появляется как result
в первой итерации цикла reduce()
. Это зависит от приложения. Если doSomethingAsync()
не нуждается в предыдущем результате, переданном ему, то инициализатор сокращения упростит $q.when()
– Roamer-1888
20 March 2015 в 10:06
chain.then
или$q.all(chain).then
, похоже, не работают – Zbynek 6 October 2016 в 11:47chain.then(function () { console.log('all resolved'); });
– redgeoff 23 December 2016 в 16:25