Synchronous for loop

59 views
Skip to first unread message

gupta....@gmail.com

unread,
Oct 24, 2017, 4:57:58 PM10/24/17
to nodejs
Hi
 I am new to node js. I am facing an issue.
I have 3 ids. I am iterating in for loop. For each value I am calling web service. The web service is find by id by passing each id. What I noticed is that it always takes the last id.
for eg: id are 10, 20, 30
When I call any service by passing in for loop it always takes 30.
Any help is appreciated.

Regards

DaneiL

unread,
Oct 24, 2017, 5:23:01 PM10/24/17
to nod...@googlegroups.com
Can u post an example?
Create gist or put some example code, so we can inspect what could be wrong in your code?

--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe@googlegroups.com.
To post to this group, send email to nod...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/88274485-8c08-4e79-bb5f-829655b97c7e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.



--
[]'s

Mark Volkmann

unread,
Oct 24, 2017, 5:23:09 PM10/24/17
to nod...@googlegroups.com
You want something like this assuming whatever you use to call the web service, fetch in my example, returns a promise.

const ids = [23, 17, 45];
const promises = ids.map(i’d => fetch(urlPrefix + id));
const results - Promise.all(promises);

You’ll have to correct the URLs being passed to fetch, but that should get you started.

---
R. Mark Volkmann
Object Computing, Inc.
--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+un...@googlegroups.com.

gupta....@gmail.com

unread,
Oct 25, 2017, 1:38:37 AM10/25/17
to nodejs
Here is my code. Its a simple one
 for(var a=0; a<dResponse.length;a++ ){
        var dId = dResponse[a].dId;
        console.log('dId-->' +dResponse);
          var dUrl = url?id=' + dId;
          console.log('Url:'+dUrl);
    }
Every time it returns the same url.

Mark Volkmann

unread,
Oct 25, 2017, 9:35:20 AM10/25/17
to nod...@googlegroups.com
There is nothing async in your loop, so it doesn’t make sense that you could get the same output from each iteration unless every object in dResponse is the same. Are you saying that you get the value of dResponse from an async call? You didn’t show that part.

Also, you are making the code to iterate through dResponse too complicated. Try something like this:

for (const res of dResponse) {
  const {dId} = res;
  console.log(‘did =‘, dId);
  const dUrl = `${url}?id=${dId}`;
  console.log(‘dUrl =‘, dUrl);
}

---
R. Mark Volkmann
Object Computing, Inc.
--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+un...@googlegroups.com.
To post to this group, send email to nod...@googlegroups.com.

Zlatko

unread,
Oct 25, 2017, 9:35:26 AM10/25/17
to nodejs


On Wednesday, October 25, 2017 at 7:38:37 AM UTC+2, gupta....@gmail.com wrote:
Here is my code. Its a simple one
 for(var a=0; a<dResponse.length;a++ ){
        var dId = dResponse[a].dId;
        console.log('dId-->' +dResponse);
          var dUrl = url?id=' + dId;
          console.log('Url:'+dUrl);
    }
Every time it returns the same url.



You didn't show the whole code - what's in dResponse array? But, your title says "Synchronous for loop", depending on your node version, here's a simple example:

const request = require('request');

function callRemoteApi(url) {
  return new Promise((resolve, reject) => {
    console.log('Fetching', url);
    request(url, (err, res) => {
      if (err) {
        return reject(err);
      }
      console.log('Got', url);
      const result = JSON.parse(res.body).url;
      resolve(result);
    });
  });
}
async function runTest() {
  const urls = [
  ];
  console.log('Urls ready.');
  let promises = [];
  for (let url of urls) {
    promises.push(callRemoteApi(url));
  };
  console.log('Promises ready.');
  await Promise.all(promises.map(async promise => console.log('Result of promise:' + await promise)))
    .then(() => console.log('All done.'));
}

runTest();

Now, if you run this code, it'll show you how things are working.

So the for loop example is indicative of potential issues with sync for loops. It takes an url, waits for it to return, and then goes on to the next.
Now, the other example works much better: we execute all promises immediately, in parallel. And as they come back, we get the results logged immediately.

Not sure how applicable this is to your situation, but if you post more code, we might help out.



 

Arun Antony

unread,
Oct 25, 2017, 9:42:56 AM10/25/17
to nod...@googlegroups.com
Use each method in underscore library.

To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe@googlegroups.com.

To post to this group, send email to nod...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/0fab98fb-38e4-4aeb-bf65-d899fd08d0d9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe@googlegroups.com.

To post to this group, send email to nod...@googlegroups.com.

gupta....@gmail.com

unread,
Oct 27, 2017, 3:39:07 PM10/27/17
to nodejs
Thank you for the response. Below is my code:
for(var i=0;i<response.length;i++){
        var messageTimeStamp = response[i].messageTimeStamp;
        console.log('messageTimeStamp-->'+messageTimeStamp);
        var body = {deviceId:req.body.deviceId};
        console.log('response1-->',response[i]);
        Custody.find(body, function(error, custodyResponse) {
        if(custodyResponse.length == 1){
          console.log('custodyResponse.length-->'+custodyResponse.length);
          console.log('response2-->',response[i]);

          }

        });

here I am getting value for response1 but not for response2

Regards


On Tuesday, October 24, 2017 at 4:57:58 PM UTC-4, gupta....@gmail.com wrote:

Mark Volkmann

unread,
Oct 27, 2017, 6:19:33 PM10/27/17
to nod...@googlegroups.com
You are using the loop index i inside a function that is invoke asynchronously. Try changing this:

console.log('response2-->',response[i]);

to this:

console.log('response2-->',response[0]);

---
R. Mark Volkmann
Object Computing, Inc.
--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+un...@googlegroups.com.

To post to this group, send email to nod...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages