【发布时间】: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