Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何链接异步函数

如何链接异步函数
EN

Stack Overflow用户
提问于 2022-09-28 04:48:56
回答 2查看 81关注 0票数 -1

我先说一下,我对编码还是很新鲜的,而且还在学习,

我正在尝试执行一个脚本,该脚本在node.js中使用两个异步函数。第一个函数使用傀儡手从网页中获取链接,第二个函数使用googleapi将数据记录到google表中。

我遇到的问题是,从第一个函数中获取的数组是第二个函数未定义的数组。

我认为这是第二个脚本在第一个脚本完成之前执行的问题,并且可以返回数据。任何洞察力或帮助都将不胜感激。

代码语言:javascript
运行
AI代码解释
复制
const puppeteer = require('puppeteer')

async function scrapeProduct(url) {
    const browser = await puppeteer.launch({
        headless: false
    });
    
    const page = await browser.newPage();
    await page.goto(url);

    const grablinks = await page.evaluate(() => {
          //retrieves links
            
    }); 

    await browser.close();
    
    return grabLinks;    
}
const {google} = require('googleapis')
const credentials = require('')

const client = new google.auth.JWT(
    credentials.client_email, 
    null, 
    credentials.private_key, 
    ['https://www.googleapis.com/auth/spreadsheets']
);


client.authorize(function(err,tokens){
    if (err){
        console.log(err);
        return;
    } else{
        console.log('Connected!');
        gsrun(client);
    }

});
async function gsrun(cl){
    
    const gsapi = google.sheets({version: 'v4', auth: cl});
    const grabLinks = await scrapeProduct();
    const updateOptions = {
        spreadsheetId: '',
        range: '',
        valueInputOption: 'USER_ENTERED',
        resource: { values :grabLinks}
    };

    let res = await gsapi.spreadsheets.values.update(updateOptions);

}

执行时会遇到以下错误:

ProtocolError:协议错误(Page.navigate):无效参数无法反序列化params.url -绑定:在位置50处丢失的强制字段

50指client.authorize(函数(Err){)的结尾

EN

回答 2

Stack Overflow用户

发布于 2022-09-28 04:59:43

  1. 请了解更多关于范围的信息。
  2. 您的函数scrapeProduct从不执行。

gsrun函数更改为:

代码语言:javascript
运行
AI代码解释
复制
async function gsrun(cl,url){
    
    const gsapi = google.sheets({version: 'v4', auth: cl});
    let grabLinks = await scrapeProduct(url);
    const updateOptions = {
        spreadsheetId: '',
        range: '',
        valueInputOption: 'USER_ENTERED',
        resource: { values :grabLinks}
    };

    let res = await gsapi.spreadsheets.values.update(updateOptions);

}

然后运行gsrun,其中包含client和所需的客户端中的url。授权的回调是您编写的。

票数 0
EN

Stack Overflow用户

发布于 2022-09-28 05:19:41

首先,您只定义了scrapeProduct,并且没有调用它:

代码语言:javascript
运行
AI代码解释
复制
async function gsrun(cl){
    const gsapi = google.sheets({version: 'v4', auth: cl});

    const grabLinks = await scrapeProduct(url); // <--- This

    const updateOptions = {
        spreadsheetId: '',
        range: '',
        valueInputOption: 'USER_ENTERED',
        resource: { values: grabLinks}
    };
    let res = await gsapi.spreadsheets.values.update(updateOptions);
}

但是,这仍然会出错。这是因为您已经将scrapeProduct定义为异步的( await将无法工作,因为scrapeProduct没有返回承诺),因此updateOptions.resource将具有未定义的值。

您可以通过确保scrapeProduct返回一个承诺来解决这个问题:

代码语言:javascript
运行
AI代码解释
复制
function scrapeProduct(url) {
    return new Promise(async(resolve, reject) => {
        const browser = await puppeteer.launch({
            headless: false
        });
    
        const page = await browser.newPage();
        await page.goto(url);

        const grablinks = await page.evaluate(() => {
              //retrieves links
            
        }); 

        await browser.close();
    
        resolve(grabLinks);
    }); 
}

现在,在await scrapeProduct(url)中调用gsrun()将工作,因为在从scrapeProduct返回grabLinks之前,代码不会进一步执行

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73881730

复制
相关文章
js如何返回异步函数结果
假设您有这样一个问题:您正在进行一个异步调用,并且需要从原始函数返回该调用的结果。
IT工作者
2022/01/01
6.4K0
关于长链接,短链接,异步,同步,单工,双工的定义
长连接:指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 短连接:是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。 同步:报文发送和接收是同步进行,既报文发送后等待接收返回报文。 同步方式一般需要考虑超时问题,即报文发出去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。 异步:报文发送和接收是分开的,相互独立的,互不
lyb-geek
2018/10/24
1.8K0
Generator 函数的异步应用
异步编程对 JavaScript 语言太重要。JavaScript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可。本章主要介绍 Generator 函数如何完成异步操作。
小小杰啊
2022/12/21
1.5K0
Python异步调用函数
Python2.x版本中,我们经常会用到异步的调用函数的功能,今天我们简单介绍一下异步执行Python函数的写法,要想实现异步调用Python函数,有几个概念需要了解。
AsiaYe
2019/12/10
3.9K0
Generator 函数的异步应用
Generator 函数的异步应用.png Generator 函数的异步应用 传统方法 回调函数 事件监听 发布/订阅 Promise 对象 基本概念 所谓"异步",简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段 所谓回调函数,就是把任务的第二段单独写在一个函数里面,等到重新执行这个任务的时候,就直接调用这个函数 Promise 对象是一种新的写法,允许将回调函数的嵌套,改成链式调用 Generator 函数 第一步
李才哥
2021/02/24
9860
Generator 函数的异步应用
异步函数async和await
前面我们介绍的是promise对象,这里我们介绍一下async...await异步函数,创建函数时候使用async关键词表示这是一个异步函数,await必须和async搭配使用
十月梦想
2018/10/09
1.3K0
一日一技:装饰器如何装饰异步函数
在 Python 开发的工程中,我们常常使用装饰器来优化代码,例如一个打印日志的装饰器:
青南
2020/02/19
3.9K1
一日一技:装饰器如何装饰异步函数
excel中的超链接函数
今天跟大家分享在excel中超链接函数的用法! ▼ 其实excel中想要达到超链接效果有很多种方法:直接手工设置、超链接函数、开发工具、VBA等都可以实现。但是工作中我们用的比较多的还是前两种: ——
数据小磨坊
2018/04/10
4K0
excel中的超链接函数
正确使用异步函数的姿势[每日前端夜话(0x06)]
在编写异步函数时,await 、 return与return await之间存在差异,选择正确的处理方式非常重要。
疯狂的技术宅
2019/03/27
1.4K0
正确使用异步函数的姿势[每日前端夜话(0x06)]
Python 实现异步调用函数
async_call.py #coding:utf-8 from threading import Thread def async_call(fn): def wrapper(*args, **kwargs): Thread(target=fn, args=args, kwargs=kwargs).start() return wrapper test.py from time import sleep from async_call import async_call
py3study
2020/01/08
2K0
Python 实现异步调用函数
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157350.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/08
1.6K0
浅谈.Net异步编程的前世今生----异步函数篇(完结)
上一篇我们着重讲解了TPL任务并行库,可以看出TPL已经很符合现代API的特性:简洁易用。但它的不足之处在于,使用者难以理解程序的实际执行顺序。
独立观察员
2022/12/06
7010
浅谈.Net异步编程的前世今生----异步函数篇(完结)
异步任务如何测试?
收到这样的问题,其实大家的问题都是通用的,那么正好整理下我的一些观点,供参考。
雷子
2022/12/29
9620
如何实现异步执行
浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接。
PM吃瓜
2019/08/12
1.1K0
如何识别IDA反汇编中动态链接库中的函数
在使用IDA静态反汇编时,如果正在逆向的文件中有动态链接库函数(比如调用了程序自定义so库中的函数),IDA只会显示一个地址,跟进去会发现是延迟绑定中关于plt的代码,无法知道具体调用了哪个函数,对于逆向起来很是麻烦,本文介绍如何识别这样的函数。 按道理讲,虽然不能动态调试,静态分析不能看到运行时绑定的地址,但是具体动态链接的过程一定也是根据文件中的信息,所以静态也一定可以知道调用的是哪个函数,但是我没有发现如何使用IDA自动确定(如有高手麻烦留言告诉我),于是通过查阅《程序员的自我修养》动态链接相关内容,
ascii0x03
2018/04/12
3.3K0
如何识别IDA反汇编中动态链接库中的函数
什么是反向链接?如何获得更多反向链接?
反向链接是从一个网站上的页面到另一个网站的链接。如果有人链接到您的网站,那么您就会从他们那里获得反向链接。如果您链接到另一个网站,则他们会向您提供反向链接。
海拥
2021/08/23
2.3K0
转:用 Async 函数简化异步代码
Promise 在 JavaScript 上发布之初就在互联网上流行了起来 — 它们帮开发人员摆脱了回调地狱,解决了在很多地方困扰 JavaScript 开发者的异步问题。但 Promises 也远非完美。它们一直请求回调,在一些复杂的问题上仍会有些杂乱和一些难以置信的冗余。
用户7293182
2022/01/20
6470
转:用 Async 函数简化异步代码
Python 回调函数实现异步处理
说到异步处理大家应该会联想到Ajax 处理,那我们先来说说什么是Ajax 请求。
Wu_Candy
2022/07/04
1.9K0
Python 回调函数实现异步处理
JavaScript异步函数async\u002Fawait
异步函数是将期约应用于JavaScript函数的结果。异步函数可以暂停执行,而且不阻塞主线程。异步函数就是async/await,它是Es8新增的。
大熊G
2022/11/14
4920
JavaScript异步函数async\u002Fawait
点击加载更多

相似问题

链接异步函数?

210

如何使用函数链接和异步函数?

20

如何使用JavaScript异步链接函数?

610

链接多个异步函数

10

不是链接异步函数吗?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档