試圖弄清楚 await 與 then 之間的細微(原文如此)差異。我已經閱讀了這里的大部分帖子,所以我知道異步函式會回傳一個承諾。
使用 await(帶有異步函式)會回傳一個可以在下游使用的 var,但是使用 .then(帶有異步函式)不會(至少對我而言)同樣回傳一個可以在 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();
更新
我想在一組鏈接 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...
} );
} ...
uj5u.com熱心網友回復:
有沒有辦法將 .then 與異步函式一起使用,以便可以在函式執行的下游訪問結果?
不,沒有可靠的方法可以做到這一點。
此外,您一開始就不需要這樣做。一旦資料可用,無論您想對承諾鏈之后的資料做什么,都可以在回呼函式中完成。
使用 await(帶有異步函式)回傳一個可以在下游使用的 var
是的,但這只是因為async-await在承諾鏈中是如何轉換的。該“下游”代碼實際上包含在then()方法的回呼函式中。
uj5u.com熱心網友回復:
沒有辦法讓承諾像你想要的那樣同步運行。唯一的方法是將依賴于承諾的代碼移動到then塊內并在那里繼續。
baz (10)
.then ( (result) =>{
z = result;
console.log('baz returned: ' z); // undefined...executes before .then completes...
});
uj5u.com熱心網友回復:
您必須等待每個承諾解決,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)})
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318772.html
