我有
urls = ['url','url','url'...]
Run Code Online (Sandbox Code Playgroud)
这就是我正在做的事情
urls.map(async (url)=>{
await page.goto(`${url}`);
await page.waitForNavigation({ waitUntil: 'networkidle' });
})
Run Code Online (Sandbox Code Playgroud)
这似乎不等待页面加载并快速访问所有网址(我甚至尝试使用page.waitFor)
只是想知道我做了一些根本错误的事情,或者不建议/支持这种类型的功能
试图在Javascript中学习异步模式,但它似乎没有等待以下行.在以下示例中,集合是请求对象,而不是实际解析的正文.是不是await应该等待请求完成?
async function importUsers(endpoint) {
const options = {
data: search,
uri: endpointCollection,
headers,
}
try {
const collection = await browser.post(options, (err, res, body) => JSON.parse(body))
// collection is the request object instead of the result of the request
const users = await collection.data.forEach(item => parseUserProfile(item));
await users.forEach(user => saveUserInfo(user))
} catch(err) {
handleError(err)
}
}
async function parseUserProfile({ username, userid }) {
const url = userProfileString(username)
try {
const profile = await browser.get(url, headers, (err, res, …Run Code Online (Sandbox Code Playgroud) 另外,这是样式问题还是功能问题?是偏好问题还是更好?我试图了解目的。
通常我用
let iterable = [10, 20, 30];
iterable.forEach((val) => {
console.log(val);
})
Run Code Online (Sandbox Code Playgroud)
但我看到这种新语法可用。
let iterable = [10, 20, 30];
for (let value of iterable) {
console.log(value);
}
Run Code Online (Sandbox Code Playgroud)
能否提供一个最佳用例的例子,当有人使用它时可能会有所启发?
我有一个稀疏数组(索引不连续),如下所示:
var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };
Run Code Online (Sandbox Code Playgroud)
我只想迭代每个项目,做一些事情,并能够在一定条件下休息.
我是Javascript的新手,我找不到合适的方法.这是我尝试过的:
内置"for..in".看来这不是迭代数组的正确方法
来自ECMASCRIPT5的forEach.这个迭代正确,但我无法摆脱循环.
来自Underscore.js的_.each().与#2相同的结果.
来自JQuery的$ .each().有了这个,我可以通过返回false来打破,但它不会正确迭代.对于上面的例子,它不是在0,5,10,15处迭代,而是在0,1,2,3,4,5,6迭代......这显然不是我所期望的.
所以我的问题是:是否有一种简单的方法来迭代稀疏数组,可能在Javascript循环期间中断,或者更好地使用另一种数据结构,如哈希表?如果有,任何推荐?
谢谢!
使用Puppeteer,我想获取具有特定类名的页面上的所有元素,然后循环并单击每个元素
使用jQuery我可以实现这一点
var elements = $("a.showGoals").toArray();
for (i = 0; i < elements.length; i++) {
$(elements[i]).click();
}
Run Code Online (Sandbox Code Playgroud)
如何使用Puppeteer实现这一目标?
在下面尝试了Chridam的答案,但我无法开始工作(尽管回答有用,所以感谢到那里)所以我尝试了下面这个工作
await page.evaluate(() => {
let elements = $('a.showGoals').toArray();
for (i = 0; i < elements.length; i++) {
$(elements[i]).click();
}
});
Run Code Online (Sandbox Code Playgroud) 我想在Array.prototype和Object.prototype上定义辅助方法.我目前的计划是做类似的事情:
Array.prototype.find = function(testFun) {
// code to find element in array
};
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
var arr = [1, 2, 3];
var found = arr.find(function(el) { return el > 2; });
Run Code Online (Sandbox Code Playgroud)
它工作正常,但如果我在循环中循环数组,for in方法显示为值:
for (var prop in arr) { console.log(prop); }
// prints out:
// 1
// 2
// 3
// find
Run Code Online (Sandbox Code Playgroud)
这将搞砸任何依赖于for in显示值的人(尤其是对象).更高版本的javascript具有内置于数组中的.map和.filter函数,但这些函数不会出现在for in循环中.如何创建更多不会出现在for in循环中的方法?
我的问题是我不知道如何知道动态promise数组何时解决了所有的promise.
这是一个例子:
var promiseArray = [];
promiseArray.push(new Promise(){/*blablabla*/});
promiseArray.push(new Promise(){/*blablabla*/});
Promise.all(promiseArray).then(function(){
// This will be executen when those 2 promises are solved.
});
promiseArray.push(new Promise(){/*blablabla*/});
Run Code Online (Sandbox Code Playgroud)
我这里有问题.当前Promise.all两个承诺被解决时,行为将被执行,但是,在这两个承诺被解决之前,第三个承诺被添加并且这个新承诺将不被考虑.
所以,我需要的是:"嘿Promise.all,你有一个动态数组来检查".我该怎么做?
请记住,这只是一个例子.我知道我可以将线Promise.all移到最后一行,但实际上新的承诺是在另一个承诺解决时动态添加的,而新的承诺也可以添加新的承诺,因此,它是一个非常动态的数组.
我拥有的真实用例是这样的:
另一个难的例子:
var allPromises = [];
allPromises.push(new Promise(function(done, fail){
mongoDB.connect(function(error){
//Because mongoDB works with callbacks instead of promises
if(error)
fail();
else
ajax.get('/whatever').then(function(){
if (somethingHappens) {
allPromises.push(new Promise(function(done, fail){ //This promise never will be take in account
// bla bla …Run Code Online (Sandbox Code Playgroud) 我从一个我不熟悉的内部实用程序库中导入了一个函数。这个库没有文档,我只是假设它是异步的,因为它的名字getUserDetails。我以为它在做一个http请求。
我在这样的异步函数中使用它
async function getAllUserInfo(event) {
const details = await getUserDetails(event);
// other stuff
}
Run Code Online (Sandbox Code Playgroud)
我的假设是错误的。一位同事指出这不是异步的。我最终改变了它,但是当我错误地使用它时它仍然有效。我能够等待同步函数并返回正确的数据。
我的问题是关于它是如何工作的。是否在同步函数上添加 await 使其在下一个滴答声中解析,还是像同步函数那样立即返回?
我正在尝试在使用循环的函数中使用async和。烦人的是我无法让它工作。应该发生的是它需要一个 event 数组,遍历它们,添加一些额外的数据,然后将它们推送到数组中。然后从原始函数返回该数组。这是我的代码:awaitforEachdocseventsevents
async function getEvents() {
...
var events = []
await addExtrasToDocsForUser(docs, currentUserId, events)
return events
}
var addExtrasToDocsForUser = (docs, currentUserId, events) => {
return docs.forEach(async (eventDoc) => {
const event = await addExtrasToDocForUser(eventDoc, currentUserId)
events.push(event)
})
}
Run Code Online (Sandbox Code Playgroud)
实际发生的是该getEvents()函数events在forEach循环完成之前作为一个空数组返回。我该如何解决?
我正在尝试使用两个并行的多文档事务更新文档,但出现以下错误:???
MongoError: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction.
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
javascript ×8
async-await ×3
node.js ×3
ecmascript-6 ×2
puppeteer ×2
arrays ×1
function ×1
mongodb ×1
mongoose ×1
promise ×1
web-scraping ×1