相关疑难解决方法(0)

使用puppeteer在循环中抓取多个URL

我有

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)

只是想知道我做了一些根本错误的事情,或者不建议/支持这种类型的功能

web-scraping google-chrome-headless puppeteer

18
推荐指数
2
解决办法
8416
查看次数

在Node中处理嵌套异步等待调用的正确方法是什么?

试图在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)

javascript node.js async-await

14
推荐指数
2
解决办法
2万
查看次数

在遍历数组时应该使用for-of还是forEach?

另外,这是样式问题还是功能问题?是偏好问题还是更好?我试图了解目的。

通常我用

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)

能否提供一个最佳用例的例子,当有人使用它时可能会有所启发?

javascript ecmascript-6

14
推荐指数
2
解决办法
3712
查看次数

Javascript迭代稀疏数组

我有一个稀疏数组(索引不连续),如下所示:

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" };
Run Code Online (Sandbox Code Playgroud)

我只想迭代每个项目,做一些事情,并能够在一定条件下休息.

我是Javascript的新手,我找不到合适的方法.这是我尝试过的:

  1. 内置"for..in".看来这不是迭代数组的正确方法

  2. 来自ECMASCRIPT5的forEach.这个迭代正确,但我无法摆脱循环.

  3. 来自Underscore.js的_.each().与#2相同的结果.

  4. 来自JQuery的$ .each().有了这个,我可以通过返回false来打破,但它不会正确迭代.对于上面的例子,它不是在0,5,10,15处迭代,而是在0,1,2,3,4,5,6迭代......这显然不是我所期望的.

所以我的问题是:是否有一种简单的方法来迭代稀疏数组,可能在Javascript循环期间中断,或者更好地使用另一种数据结构,如哈希表?如果有,任何推荐?

谢谢!

javascript arrays

13
推荐指数
1
解决办法
6735
查看次数

按类名收集元素,然后单击每个元素 - Puppeteer

使用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)

javascript node.js puppeteer

13
推荐指数
4
解决办法
1万
查看次数

如何在Array.prototype和Object.prototype上的javascript中定义方法,以便它不会出现在for循环中

我想在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循环中的方法?

javascript function

12
推荐指数
2
解决办法
9907
查看次数

如何知道所有Promise何时被动态"可迭代"参数解析?

我的问题是我不知道如何知道动态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移到最后一行,但实际上新的承诺是在另一个承诺解决时动态添加的,而新的承诺也可以添加新的承诺,因此,它是一个非常动态的数组.

我拥有的真实用例是这样的:

  1. 我使用Twitter API检查是否有新的推文(使用搜索Api).
  2. 如果我发现新的推文,我将它添加到MongoDB(这里我们有Promises).
  3. 如果这些新推文与我在MongoDB中没有的用户相关(这里我们有新的承诺,因为我必须去MongoDB检查我是否有该用户),我们转到Twitter API获取用户信息(更多承诺)我们将这些新用户添加到MongoDB(是的,更多的承诺).
  4. 然后,我去MongoDB插入新的值来将新推文和那些新用户联系起来(更多的承诺!wiii!).
  5. 当所有对MongoDB的查询都已解决(所有选择,更新,插入)时,关闭MongoDB连接.

另一个难的例子:

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)

javascript promise ecmascript-6

11
推荐指数
2
解决办法
3708
查看次数

等待同步函数是否同步返回值?

我从一个我不熟悉的内部实用程序库中导入了一个函数。这个库没有文档,我只是假设它是异步的,因为它的名字getUserDetails。我以为它在做一个http请求。

我在这样的异步函数中使用它

async function getAllUserInfo(event) {
    const details = await getUserDetails(event);
    // other stuff
}
Run Code Online (Sandbox Code Playgroud)

我的假设是错误的。一位同事指出这不是异步的。我最终改变了它,但是当我错误地使用它时它仍然有效。我能够等待同步函数并返回正确的数据。

我的问题是关于它是如何工作的。是否在同步函数上添加 await 使其在下一个滴答声中解析,还是像同步函数那样立即返回?

javascript async-await

11
推荐指数
2
解决办法
4035
查看次数

foreach中的异步/等待不等待

我正在尝试在使用循环的函数中使用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()函数eventsforEach循环完成之前作为一个空数组返回。我该如何解决?

javascript async-await

11
推荐指数
3
解决办法
9781
查看次数

MongoError: WriteConflict 错误:此操作与另一个操作冲突。请重试您的操作或多次

我正在尝试使用两个并行的多文档事务更新文档,但出现以下错误:???

MongoError: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction. 
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

mongoose mongodb node.js

9
推荐指数
1
解决办法
1537
查看次数