Code Monkey home page Code Monkey logo

Comments (4)

clementvp avatar clementvp commented on May 13, 2024 3

Thanks you for the quick answer.
I was opening a new tab in my for loop instead reusing the initial tab and it was very confuse in my mind juggle with async/await and promises.
Your answer is very neat and clear for me and it's work well in my case.
Thanks for all the tips (specially the 'check urls before' I will not think of it) and the time, you are great :)

from nickjs.

SaShimy avatar SaShimy commented on May 13, 2024 2

Hi @clementvp ,
So you better understand I will put an example at the end of my response but the async/await thing is very easy to understand: async functions declared with the "async" keyword will return a promise and in "async" functions you can use the keyword "await" that make the script stop until the promise returned by the function is resolved.

Putting await before a function returning a promise force to wait the resolved promise (or the error thrown) to continue. So if you use a for a loop and a function returning a promise with the keyword "await" it will work as a normal for loop (you also need tab in your context to use it see the code below).

And you were missing the await keyword before tab.evaluate(), so the code ran before tab.evaluate() even finished.

Also take care to verify if the url you want to open is also valid so you don't crash your script (they might be urls from the list that can't be opened).

require('babel-polyfill')
const Nick = require('nickjs')
const nick = new Nick()

nick.newTab().then(async function (tab) {
	await tab.open('https://news.ycombinator.com/')
	await tab.waitUntilVisible('#hnmain')
	await tab.inject('https://code.jquery.com/jquery-3.1.1.slim.min.js')
	const urls = await tab.evaluate((arg, callback) => {
		const data = []
		$('.athing').each((index, element) => {
			data.push($(element).find('.storylink').attr('href'))
		})
		callback(null, data)
	})
	for (var i = 0; i < urls.length; i++) {
		await tab.open(urls[i])
		// Do other things using await like "await tab.waitUntilVisible(selector)" or "await tab.screenshot("screen.jpg")"
		// Using the await keyword you can make asynchronous functions working the same way
		// As synchronous functions, so the for loop will end only when all the functions here are done
	}
	// No worry with await you can't get here before the loop is finished
	nick.exit()
})
.catch((err) => {
	console.log('Oops, an error occurred: ' + err)
	nick.exit(1)
})

PS: I see you are using "import" keyword to import libraries, this will not be in node.js for now and so we are changing it back to require in nickjs/phantombuster in the future so I wrote it there so you can be prepared for the change.

PS2: I see you are using a for loop with a counter, with the loop for ... of you could maybe do that in a better way -> see this example

for(const url of urls) {
  await tab.open(url)
  // Do as before but instead of using a counter you can now use url
}

from nickjs.

tomasjanu avatar tomasjanu commented on May 13, 2024

It still seams to me that all the tabs (opened by loop) wait for each other.

Can we run them in paralel?

from nickjs.

paps avatar paps commented on May 13, 2024

Yes, each tab can be run in parallel. Can you show your code?

from nickjs.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.