【问题标题】:How to implement async / await如何实现异步/等待
【发布时间】:2020-12-17 13:31:38
【问题描述】:

我想知道如何在 response.json() 中返回一个新的对象数组以在失眠中可见。

我从 API 接收各种信息,目标是返回我的前端,只是我创建的 response.json () 中的对象数组。

所以我想将它们存储在一个变量中。

这是代码:

    var T = new Twit({
        consumer_key: process.env.CONSUMER_K,
        consumer_secret: process.env.CONSUMER_S,
        access_token: process.env.ACCESS_T,
        access_token_secret: process.env.ACCESS_T_S,
        timeout_ms: 60 * 1000,
        strictSSL: true,
})

app.get('/teste', (request, response) => {

let obj = {};
let obj2 = {};

    T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=******=1', (err, data, response) => {

        data.map(item => {
            obj.name = item.user.name;
            obj.texto = item.text;
            obj.profileImage = item.user.profile_image_url;
        });
    });
    T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=u*******=1', (err, data, response) => {
    
        data.map(item => {
            obj2.name2 = item.user.name;
            obj2.texto2 = item.text;
            obj2.profileImage2 = item.user.profile_image_url;
        });
    
    });   

    setTimeout(() => {
      return response.json([obj, obj2]);
    }, 1000);
    
});

在负责我的人的帮助下,能够返回一个更干净的 json,但现在我想知道如何实现 aync / await 来代替“setTimeout()”,因为该函数只返回一个使用“setTimeout()”的“dalay”时的数组。

谢谢!

【问题讨论】:

    标签: javascript node.js json async-await insomnia


    【解决方案1】:

    问题是您的数组变量超出了路由函数,使其成为全局变量,这意味着即使您创建新的 GET 请求,也会存储先前的数组值。因此,您可以在路由函数中添加数组变量,也可以在发出 GET 请求后立即清空数组。

    一个例子:

      var T = new Twit({
                consumer_key: process.env.CONSUMER_K,
                consumer_secret: process.env.CONSUMER_S,
                access_token: process.env.ACCESS_T,
                access_token_secret: process.env.ACCESS_T_S,
                timeout_ms: 60 * 1000,
                strictSSL: true,
        })
        
        app.get('/teste', (request, response) => {
            var obj = {};
            T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=******=1', (err, data, response) => {
        
                data.map(item => {
                    obj.name = item.user.name, 
                    obj.texto = item.text 
                    obj.profileImage = item.user.profile_image_url
                });
        
            });
            T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=u*******=1', (err, data, response) => {
            
                data.map(item => {
                    obj.name2 = item.user.name, 
                    obj.texto2 = item.text 
                    obj.profileImage2 = item.user.profile_image_url
                });
            
            });    
        
            return response.json([obj]);
        });
    

    【讨论】:

    • Megh,感谢您的评论,但是您能给我一个您的解决方案示例吗?我是编程初学者。
    • 您的解决方案对我有帮助,但我相信由于 API 延迟,我的响应是空的,所以我在末尾放了一个“setTimeout()”。我这样做是因为我无法实现异步/等待。但是它正在运行。我改变了我的代码现在的样子。请看一看。我现在正在尝试放置一个“异步/等待”。
    【解决方案2】:

    不是每次都推送一个新对象,而是创建并清空对象并为同一个对象分配值。

    var T = new Twit({
            consumer_key: process.env.CONSUMER_K,
            consumer_secret: process.env.CONSUMER_S,
            access_token: process.env.ACCESS_T,
            access_token_secret: process.env.ACCESS_T_S,
            timeout_ms: 60 * 1000,
            strictSSL: true,
    })
    
    app.get('/teste', (request, response) => {
        let arr0 = []
        T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=******=1', (err, data, response) => {
    
            data.map(item => {
                const temp = {
                    profileImage: item.user.profile_image_url,
                    name: item.user.name,
                    texto: item.text,
                };
                arr0.push(temp);
            });
        });
        T.get('https://******.com/1.1/statuses/user_timeline.json?screen_name=u*******=1', (err, data, response) => {
        
            data.map(item => {
                const temp = {
                    profileImage2: item.user.profile_image_url,
                    name2: item.user.name,
                    texto2: item.text,
                };
                arr0.push(temp);
            });    
        });
        
        return response.json([temp]);
    });
    

    【讨论】:

    • Darkash,感谢您的评论。然而,当我运行这段代码时,没有可视化的失眠只是一个空数组:[{}]。使用“debug”,我看到变量“name”、“text”和“profileImage”被分配了它们各自的值,包括在变量“temp”中。但是,它们不会在 console.log() 或 insomnia 预览中返回。
    • @IvoJunior 我们可以推断出合并它们的第一个请求和第二个请求之间的响应中的连接键是什么?另外我认为如果我们不能拉动它们之间的连接,那么更好的 json 表示将是来自同一索引中的第一个和第二个请求的一对对象。
    • 感谢您的帮助。你的解决方案也让我做好准备。
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 2018-04-05
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多