【问题标题】:node js async/await request in function节点js异步/等待函数中的请求
【发布时间】:2017-05-01 13:41:12
【问题描述】:

您好,我在 nodejs 中的 async/await 遇到了一些问题。我会以这种方式将它用于我的工厂

//foo.js    

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

   function Foo(options) {
        this.options = options;
    }

    function create() {
        return new Foo(login());
    }

    async function login() {
        const options = {
            method: `POST`
            ,json: true
            ,uri: `http://xxxxxx/login`
            ,body: {username: 'abcd', password: '1234'}
        };
        try {
            const response = await rp(options);
            return Promise.resolve(response)
        }
        catch (error) {
            return Promise.reject(error);
        }
    }
  module.export.create = create;

所以我在我的测试中调用了create,我期望登录后会执行返回,但是流程不是这样的!!!

var Foo = require('foo');

describe('using my utils into project', function () {

        it('using real case', function (done) {

            var foo = Foo.create();
            console.log(foo.options);
            done();
        });

    });

测试返回我确定,但在控制台中我看到Promise { <pending> } 在登录过程后没有真正的响应。 我的错误在哪里?以这种方式工作是否正确?

【问题讨论】:

  • 与往常一样,无法将异步代码转换为同步代码。甚至没有异步/等待。 async 关键字返回一个承诺,而不是一个值。这是因为代码是异步的,不能在调用函数的那一刻返回值。我强烈建议在使用 async/await 之前先学习 Promise
  • 好的,但是我可以正确使用 async/await 吗?这是我的麻烦
  • @slebetman await 接受一个承诺并等待它的值可用,然后返回该值。这是正确的吗?
  • await 暂停 async 函数,直到一个 promise 被解析并且该 promise 的结果作为一个值返回。那是对的。但是,async 返回一个承诺。您不能在async 函数之外使用await,因为您无法将异步代码转换为同步代码。正确的方法是设计你的create 函数来返回一个承诺。看看 jQuery API 是如何设计的。为您的 create 函数建模 jQuery.ready() 如何工作。
  • @slebetman 好的,这很清楚,正如您所看到的,我正在以正确的方式使用 async/await,并且我刚刚编辑了代码以返回已解决的承诺,但结果是相同的:/

标签: node.js asynchronous async-await


【解决方案1】:

试试这个

//foo.js    

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

function Foo(options) {
    this.options = options;
}

async function create() {
    var temp = await login()
    return Promise.resolve(new Foo(temp));
}

function login() {
    return new Promise(async(resolve, reject) => {
        const options = {
            method: `POST`
            ,json: true
            ,uri: `http://xxxxxx/login`
            ,body: {username: 'abcd', password: '1234'}
        };
        try {
            const response = await rp(options);
            return resolve(response)
        }
        catch (error) {
            return reject(error);
        }
    });
}
module.export.create = create;

async function main() {
    var foo = await Foo.create();
    console.log(foo.options);
}

main();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多