如何在节点js中使async / await正常工作?

时间:2019-03-12 08:33:52

标签: node.js

我是Node JS编码的新手,我的代码中有两个函数,我已经使用async关键字进行了异步处理,但问题是它不起作用,第二个函数的输出在第一个函数之前出现,但是我想要下面给出的第二个函数之前的第一个函数的输出是我的代码

var request = require("request").defaults({jar: true});

var cookieJar = request.jar();

var options = { method: 'POST',
url: 'http://69.30.210.130:8082/api/session',
headers:
    { 'content-type': 'application/x-www-form-urlencoded' },
form: { email: 'admin', password: 'admin' } };

request(options, async function (error, response, body) {
if (error) throw new Error(error);

let bod=await body;
console.log(bod)
});

var options = { method: 'GET',
url: 'http://69.30.210.130:8082/api/devices',
qs: { id: '1' },
headers:
{ 'postman-token': '021a3566-e1ea-4dd4-4ceb-c81ecd25ddd1',
 'cache-control': 'no-cache' } };

request(options, function (error, response, body) {
if (error) throw new Error(error);

console.log(body);
});

1 个答案:

答案 0 :(得分:1)

request默认使用回调,这意味着当您要链接多个请求时,必须采用以下方式:

// first request
request({...}, function(error, response, body1) {
    if (error) return console.error('Error', error.message);

    // second request
    request({...}, function(error, response, body2) {
        if (error) return console.error('Error', error.message); 

        console.log(body1, body2);
    });
});

async/await旨在简化使用Promise的工作,因此您可以使用request-promise

const rp = require('request-promise');

(async function() { // await can be called only from within an async func
    try {
        const body1 = await rp({...}); // first request
        const body2 = await rp({...}); // second request

        console.log(body1, body2);

    } catch (e) {
        console.error('Error', e.message);
    }
})();

在这里,body2将在解决body1之后得到解决。这意味着async/await将同步行为带入异步处理。

您可以直接使用基于承诺的axios


编辑:从回调中删除async,添加axios参考