首页 > 解决方案 > Nodejs请求功能仍未完成但代码继续下一步?

问题描述

nodejs 有点新,我似乎无法让我的回调函数工作。现在我的函数只想检查 URL 是否存在

const request = require('request')
const URL = 'http://sampleurl.com'
var urlexists = false

async _urlExists(URL){
    request(url, function (error, response, body) {
      if (!error && response.statusCode.toString()[0] === '2'){
        urlexists = true
      } else {
        throw new Error(`url is not working: ${URL}`)
      }
    })
  }  

问题是,我的代码继续执行下一个,意思是result is passed,但几秒钟后,控制台显示错误提示url is not working: ${URL}

基本上我只是打电话 await this._urlExists(URL)

标签: node.jscallbackrequest

解决方案


_urlExists函数在调用后立即返回request,然后等待响应。该_urlExists函数需要返回一个 Promise 以便调用者知道数据何时准备就绪。

我查找了您正在使用的npm 包,如果不使用wrapper 包request,它不支持 Promises 。request-promise-native

但是,您仍然可以将request调用包装在 Promise 中:

async _urlExists(URL) {
    return new Promise((resolve, reject) => {
        request(url, function (error, response, body) {
            if (!error && response.statusCode.toString()[0] === '2'){
                urlexists = true;
                resolve(true);
            } else {
                reject(`url is not working: ${URL}`);
            }
        });
    });
}

现在,当您调用 时await this._urlExists,该函数将暂停以等待resolveorreject响应,然后再继续。要从可能reject的调用中捕获错误,请将调用包装_urlExists在一个try-catch块中。

还要确保您正在调用的函数await this._urlExists声明为async,因为await关键字只能在async.

如果您在实施我的解决方案时遇到任何问题或疑问,请在评论中告诉我。


推荐阅读