Comments (4)
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.
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.
It still seams to me that all the tabs (opened by loop) wait for each other.
Can we run them in paralel?
from nickjs.
Yes, each tab can be run in parallel. Can you show your code?
from nickjs.
Related Issues (20)
- Is it possible to change userAgent? HOT 1
- Running NickJs in node:9-alpine HOT 1
- Features that would be nice HOT 2
- calling nick.exit() closes chrome process and node process HOT 2
- Cannot open two node instances HOT 1
- Independent tabs with PhantomJS HOT 1
- I have a question for many requests HOT 3
- Acessing frame elements HOT 1
- Phantombuster api-store source removed? HOT 2
- Trying to save content with fs.writeFile HOT 2
- could not list chrome tabs: Error: connect ECONNREFUSED 127.0.0.1:9222 HOT 12
- Help request: Struggling to do what feels like fairly basic push 'show more' button and scroll HOT 3
- Setting environment variables on PHP / Ubuntu HOT 8
- Using jQuery instead of querySelector on Tab HOT 1
- Error: timeout: load event did not fire after xxx ms HOT 1
- I have a lot of same error[you may have forgotten to catch a Promise rejection] HOT 3
- Ability to set custom Chrome flags on NickJS constructor
- Drivers/browser
- site data
- Question about this project HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nickjs.