【问题标题】:Return an array of single element from page.click() callback从 page.click() 回调返回单个元素的数组
【发布时间】:2018-10-27 20:40:12
【问题描述】:

这是来自document for page.click() for Puppeteer

 const [response] = await Promise.all([
  page.waitForNavigation(waitOptions),
  page.click(selector, clickOptions),
]);

由于只有一个返回值response,我不太明白为什么不是如下:

 const response = await Promise.all([
  page.waitForNavigation(waitOptions),
  page.click(selector, clickOptions),
]);

有人能解释一下这个声明吗?

【问题讨论】:

    标签: puppeteer


    【解决方案1】:

    这与 Promise.all 的工作方式有关,而不是与 puppeteer 有关。

    Promise.all:[...] 返回的 Promise 由包含所有 作为参数传递的可迭代的值(也是非承诺值)。

    这意味着await Promise.all(...) 返回一个包含两个 Promise 的结果的数组。现在让我们看看这两个 Promise 都实现了什么:

    所以await Promise.all([ ... ]) 将生成一个数组,其中第一个值是主资源响应,第二个值未定义。

    感谢destructuring assignment,我们可以这样写:

    const [response, valueWhichWillBeUndefined] = await Promise.all([ ... ]);
    

    由于我们对第二个值不感兴趣,我们可以将那个变量排除在外(我们知道它将是未定义的),结果是:

    const [response] = await Promise.all([ ... ]);
    

    【讨论】:

    • Thomas Dondorf,你是对的,Promise.all 就是这样定义的。让我重新提出我的问题,如果我只关心promise1 的返回,那么做const response = Promise.all(promise1, promise2) 是否正确?它比具有单个元素的数组更干净。谢谢。
    • 根据我的测试,response 的单个变量不会导致错误,它会返回一个object 的数组。如果被拒绝,则为undefined
    • 如果你写const response = Promise.all([...]),响应将是一个数组。所以这行得通,但是你必须写 reponse[0] 来访问你想要的值。如果您写const [response] = ...,则响应将分配给数组的第一个值(查看我的答案中有关解构分配的链接)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多