1

I read somewhere in the past that angular.foreach is asynchronous unlike looping over arrays which is synchronous. For a long time I was taking into account this and doing the necessary to avoid executing the code which comes after the loop before it's finishes all its iterations (by wrapping the angular.foreach inside an anonymous JavaScript function which calls a callback which will be executed once the loop finishes all iterations).

(function(callback){
  angular.foreach(..)
  callback();
})(callback)

But I had a conversation with a collegue who didn't agree that angular.foreach is asynchronous and I also couldn't find that information again which makes me confused now.

2 Answers 2

3

no. Take a look at the docs

Furthermore your code wouldn't work if foreach would be asynchronous. If foreach would be async, the callback would be called immediately after calling foreach and foreach would be put onto the eventqueue which would execute it some time in the future.

Javascripts concurrency model does not have threads but instead uses an eventloop. This means every async operation is pushed onto the eventqueue and executed later.

Have a look into the MDN

Sign up to request clarification or add additional context in comments.

1 Comment

thanks for this answer, but can you please tell me where in the angular.forEach doc it's written about whether it's synchronous or not ?
0

There may be a scenario where you want to make code behave asynchronously.

I had a scenario where I used local storage to store an ad-hoc user selected collection of jobs that I wanted to perform the same operation on.

I had a web service call to convert a list of job names into a returned a collection of job objects. I initially tried using a foreach loop inside the subscribe pf the service layer, that operated on the results.

Then I tried calling another method within the foreach loop that as it performed the operations removed the job name from local storage when the operation posted to the web service correctly.

The problem was on the second iteration I read the collection of names from local storage again - before the set to remove had completed.

There was a lot of manipulation of the job and object properties to create the parameters passed on the function call, so I ended up refactoring the code, creating a value object interface and stored the information in a value object array for the whole job collection I had returned. I included the index of the job too in the value object.

I introduced a BehaviourSubject property to the class.

During the restructuring, I just added an entry to the value object array collection within the forEach loop instead. At the end of the loop. I sent next(0) to the BehaviourSubject to start the ball rolling.

Each time a job name was removed from local storage, I converted service to return a Promise.

Then in the code after the service was called I put this code in the then part, behaviour subject.next(index from value object +1)

In the initialisation I set the behaviour subject up with a -1 value..

Then in the subscription to the BehaviourSubject class I ignored -1, And when the index +1 was > length of value object collection called completion routine - which bounce app back to prior page.

When the index was between 0 and 1 less than collection size, I just called the method that had originally been in the forEach loop with the value object entry with the value object match the index of the behaviour subject.

By doing this I had converted the behaviour of the forEach into something asynchronous.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.