await vs then - 访问返回值
await vs then - accessing returned values
试图了解 await 与 then 之间的细微(原文如此)差异。我已经阅读了这里的大部分帖子,所以我得到了异步函数 return 的承诺。
使用 await(带有异步函数)returns 是一个可以在下游使用的 var,但是使用 .then(带有异步函数)同样不会(至少对我而言)return一个可以在 then 子句之外访问的 var),因为它是异步处理的,而下游引用是同步处理的 - 在 .then 子句之外,var(在我的例子中)是未定义的。
我理解为什么我的示例会这样运行,但我的问题是 - 有没有办法将 .then 与异步函数一起使用,以便可以在下游访问结果函数执行?
let x, y, z;
async function foo ( num ) {
return Promise.resolve ( num + 10 );
}
async function bar (num) {
return num + 20;
}
async function baz (num) {
return Promise.resolve ( num + 30 );
}
async function main (){
x = await foo(10);
console.log('foo returned (after await): '+ x); // no hay problema!
y = await bar (10);
console.log('bar returned (after await): '+ y); // no hay problema!
baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z); // undefined...executes before .then completes...
}
main();
更新
我想我 objective 在一组链式 then 子句之外使用 x 和 y 时遇到了一些问题。这是我正在尝试做的(希望更多)真实示例:
在下面的代码中,schemaValidation 可用于 express 应用程序中的任何路由(所述路由在 initAppRouter 中初始化):
// main
const schemaDB = await initAppDBSchema ();
const schemaValidation = await initAppDataValidationSchema();
const Author = mongoose.model ( 'Author', schemaDB );
let author: any;
let authors: any;
await initAppDB ();
await initAppRouter ();
async function initAppDataValidationSchema () {
return joi.object ( {
authorName: joi.string ()
.min ( 3 )
.max ( 30 )
.required (),
etc...
} );
} ...
is there a way to use .then with an async function, such that the
result can be accessed downstream of the function execution?
没有。没有可靠的方法可以做到这一点。
此外,您一开始就不需要这样做。无论您想对数据做什么,一旦数据可用,承诺链就可以在回调函数内完成。
Using await (with an async function) returns a var that can be used
downstream
是的,但这只有在承诺链中 async-await
的转换方式才有可能。 "downstream" 代码实际上包装在 then()
方法的回调函数中。
无法让 promise 像您希望的那样同步运行。唯一的方法是将依赖于 promise 的代码移动到 then
块中并继续。
baz (10)
.then ( (result) =>{
z = result;
console.log('baz returned: '+ z); // undefined...executes before .then completes...
});
您必须等待使用 await
解决每个承诺,以便代码以非异步方式运行,或者使用 then
进行链式回调
await baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z)
所以一切都完成了,或者
baz (10)
.then ( (result) =>{z = result;})
.then ( () =>{console.log('baz returned: '+ z)})
试图了解 await 与 then 之间的细微(原文如此)差异。我已经阅读了这里的大部分帖子,所以我得到了异步函数 return 的承诺。
使用 await(带有异步函数)returns 是一个可以在下游使用的 var,但是使用 .then(带有异步函数)同样不会(至少对我而言)return一个可以在 then 子句之外访问的 var),因为它是异步处理的,而下游引用是同步处理的 - 在 .then 子句之外,var(在我的例子中)是未定义的。
我理解为什么我的示例会这样运行,但我的问题是 - 有没有办法将 .then 与异步函数一起使用,以便可以在下游访问结果函数执行?
let x, y, z;
async function foo ( num ) {
return Promise.resolve ( num + 10 );
}
async function bar (num) {
return num + 20;
}
async function baz (num) {
return Promise.resolve ( num + 30 );
}
async function main (){
x = await foo(10);
console.log('foo returned (after await): '+ x); // no hay problema!
y = await bar (10);
console.log('bar returned (after await): '+ y); // no hay problema!
baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z); // undefined...executes before .then completes...
}
main();
更新
我想我 objective 在一组链式 then 子句之外使用 x 和 y 时遇到了一些问题。这是我正在尝试做的(希望更多)真实示例:
在下面的代码中,schemaValidation 可用于 express 应用程序中的任何路由(所述路由在 initAppRouter 中初始化):
// main
const schemaDB = await initAppDBSchema ();
const schemaValidation = await initAppDataValidationSchema();
const Author = mongoose.model ( 'Author', schemaDB );
let author: any;
let authors: any;
await initAppDB ();
await initAppRouter ();
async function initAppDataValidationSchema () {
return joi.object ( {
authorName: joi.string ()
.min ( 3 )
.max ( 30 )
.required (),
etc...
} );
} ...
is there a way to use .then with an async function, such that the result can be accessed downstream of the function execution?
没有。没有可靠的方法可以做到这一点。
此外,您一开始就不需要这样做。无论您想对数据做什么,一旦数据可用,承诺链就可以在回调函数内完成。
Using await (with an async function) returns a var that can be used downstream
是的,但这只有在承诺链中 async-await
的转换方式才有可能。 "downstream" 代码实际上包装在 then()
方法的回调函数中。
无法让 promise 像您希望的那样同步运行。唯一的方法是将依赖于 promise 的代码移动到 then
块中并继续。
baz (10)
.then ( (result) =>{
z = result;
console.log('baz returned: '+ z); // undefined...executes before .then completes...
});
您必须等待使用 await
解决每个承诺,以便代码以非异步方式运行,或者使用 then
await baz (10)
.then ( (result) =>{
z = result;
});
console.log('baz returned: '+ z)
所以一切都完成了,或者
baz (10)
.then ( (result) =>{z = result;})
.then ( () =>{console.log('baz returned: '+ z)})