【问题标题】:Understanding nodejs promises asynchronous functions理解 nodejs 承诺异步函数
【发布时间】:2018-08-26 10:33:09
【问题描述】:

我对在 AWS Lambda 函数中使用的 Promise 和异步任务有点困惑。

我已经编写了一个小程序,其中包含我所掌握的知识,它试图对给定的 URL 进行网络抓取。但是,当我使用无效地址运行时,程序挂起而不是返回我的无效请求。当 url 有效时,它会运行而不会失败,尽管我预计不会像预期的那样。

如果有人可以帮助我了解我的错误配置在以下代码中的位置,或者我打算以完全错误的方式承诺,我将不胜感激。

const request = require('request');
const await = require('await');
const async = require('async');

exports.handler = async function(event, context, cb) {
  var domain = "https://google.com"
  var uri = "/non/existant/path"
  var url = `${domain}${uri}`

  var webpage = await getWebpage(url)

  cb(null, 'success')
}

function getWebpage(url) {
  console.log(`Connecting to '${url}'`)
  return new Promise(function (resolve, reject) {
    request(url, function(error, response, body) {
      console.log(response.statusCode)
      if (response.statusCode != 200) {
        console.log(`ERROR: ${response.statucCode}`);
        reject(`See logs for details`);
      }
      console.log('Connected! Saving contents')
      resolve(body);
    });
  });
}

【问题讨论】:

  • 如果你有 Promises,为什么要cb(null, 'success')
  • the program hangs 是什么意思?
  • 噢,不要这样做const await = require('await'); const async = require('async'); !!这些是关键字,就像functionif !!
  • 使用util.promisify 将回调fns 转换为promise 和util.callbackify 用于另一个方向

标签: javascript node.js asynchronous promise aws-lambda


【解决方案1】:

您的代码似乎存在三个问题。首先,asyncawait 不是库,它们是关键字(正如 Jonas 所提到的)。其次,真的不清楚为什么要将回调传递给返回承诺的函数(exports.handler);您正在构建的 API 可能会令人困惑。

第三,直接回答您关于为什么无效 URL 不起作用的问题:在尝试检查响应代码和/或正文之前,您没有检查响应是否有错误。试试下面的代码。

const request = require('request')

exports.handler = async function(event, context, cb) {
  var domain = "https://google.com"
  var uri = "/non/existant/path"
  var url = `${domain}${uri}`

  var webpage = await getWebpage(url)

  cb(null, 'success') // <- It's unclear why you'd want to do this.
}

function getWebpage(url) {
  console.log(`Connecting to '${url}'`)
  return new Promise(function (resolve, reject) {
    request(url, function(error, response, body) {

      // First, check for an error.
      if (error) return reject(error)

      // Next, check the status code.
      if (response.statusCode != 200) {
        console.log(`ERROR: ${response.statusCode}`);
        return reject(new Error(response.statusCode));
      }

      // Okay, now resolve if the above checks were good.
      console.log('Connected! Saving contents')
      resolve(body)
    })
  })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-03
    • 2019-06-21
    • 1970-01-01
    • 2022-06-10
    • 2022-01-26
    • 2018-09-07
    • 2020-08-28
    • 2019-04-13
    相关资源
    最近更新 更多