使用请求进行异步调用并让回调在函数中工作[重复]

Posted

技术标签:

【中文标题】使用请求进行异步调用并让回调在函数中工作[重复]【英文标题】:Asyncronous call using request and getting callback to work within a function [duplicate] 【发布时间】:2019-12-10 05:38:16 【问题描述】:

我在网络方面不是很有经验,我正在尝试在一个类中进行一个简单的 api 调用。我遇到了新人面临的非常经典的回调问题,虽然有很多关于如何处理这个逻辑的例子,但我很难在一个类中实现它。我正在使用request。显然,下面的任何内容都不起作用,尤其是与 myBody 相关的内容,但我添加它是为了展示在担心异步调用之前我是如何从逻辑上考虑它的。

const request = require('request);

class GetData
  constructor()
    this.getData();
  

  reallyGetData()
      var myData = this.getdata;
      return myData;
  

  getData()
    //var myBody;
    request('url':`https://somewebsite.com/things.json`, 'json': true , function (error, response, body) 
        console.log('error:', error); // Print the error if one occurred
        console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received

        // Successfully returns body as expected
        console.log("From inside getData: " + body);
        //myBody = body;
        );
    //return myBody;
    

我找到的最有用的链接是this one。

但是,我对 node(和 javascript 一起)还很陌生,我似乎无法获得添加回调函数的语法。我从示例中尝试的所有内容都是无效语法,所以当我尝试添加类似于以下的回调函数时:

getData(function(result) 
    console.log(result);

我不知道如何在一个类中实现这个逻辑。

【问题讨论】:

并不是说你不能让它与你的 request 库一起工作,但如果你确实发现你想尝试一个类似的 API 与 Promise 一起工作,我建议你采取看node-fetch或request-promise-native 【参考方案1】:

getData() 应该被声明为将函数作为“一等公民”。它也可以称为函数指针。

getData(callback) 
    ...

    callback(result);

调用它时,你会使用

getData(function(result)  ... );

【讨论】:

【参考方案2】:

你可以使用等待操作符。

const request = require('request');

class Data 
    constructor() 
    
    async getData() 
        var myBody;
        await request( 'url': 'https://somewebsite.com/things.json', 'json': true , (error, response, body) => 
            myBody = body;
        );
        return myBody;
    


(new Data()).getData().then(data => 
    // data is the value of response
    console.log(data);
);

【讨论】:

以上是关于使用请求进行异步调用并让回调在函数中工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 完成回调如何在 Kotlin 中工作

如何让打字稿方法回调在 VueJs 中工作?

异步回调函数

樱桃采摘如何在 Azure devops 中工作 [重复]

在循环中调用异步函数时避免重复创建函数

并发编程