我正在研究 await promises 在node.js
下面的程式是通過main()在底部呼叫來運行的。
main()呼叫函式caller()。caller()然后呼叫loop()超時 2 秒的函式并回傳一條我等了 2 秒 的訊息。loop()回傳到caller(),然后caller()回傳到main(),只是為了傳遞相同的訊息。
caller() 和 main() 實際上是相同的代碼,它們應該以相同的方式回傳!!但是回傳 main() 是未定義的。
Eclipse 運行結果:
C:\Users\Lenovo\eclipse-workspace.metadata.plugins\org.eclipse.wildwebdeveloper.embedder.node\node-v14.15.4-win-x64\node.exe awaitPromise2.js“頂級開始..主要開始。 .. 在回圈中,開始 aaa :新回圈,完成輸出:訊息:我在呼叫方中等待了 1 秒 aaa :訊息:我在呼叫方中等待了 1 秒,決議 aaa :訊息:我在主中等待了 1 秒,回應:在 main 中未定義,決議結果:未定義
程式檔案是:
async function loop() {
let aaa = "New";
console.log("in loop, start aaa : " aaa);
await new Promise((resolve, reject) => setTimeout(resolve, 2000));
aaa = " Message: I waited 2 sec.";
return new Promise((resolve) => {
console.log("loop, finished output : " aaa);
resolve(aaa);
return;
});
}
async function caller() {
await loop().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 3000));
console.log("in caller aaa :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 1500));
let bbb = aaa;
console.log("in caller, resolve aaa : " bbb);
resolve(bbb);
});
});
}
async function main() {
console.log("main start ...");
await caller().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 5000));
console.log("in main, response :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 6000));
console.log("in main, resolve result : " aaa);
resolve(aaa);
return;
});
});
}
console.log(" Top Level starts..");
main();
我利用超時試圖等待結果的到來。他們需要嗎??
uj5u.com熱心網友回復:
讓我們從沒有做任何事情的代碼中洗掉所有多余的東西:
async function loop() {
let aaa = "New";
console.log("in loop, start aaa : " aaa);
await new Promise((resolve, reject) => setTimeout(resolve, 2000));
aaa = " Message: I waited 2 sec.";
console.log("loop, finished output : " aaa);
return Promise.resolve(aaa);
}
async function caller() {
await loop().then(function (aaa) {
console.log("in caller aaa :" aaa);
let bbb = aaa;
console.log("in caller, resolve aaa : " bbb);
return Promise.resolve(bbb);
});
}
async function main() {
console.log("main start ...");
await caller().then(function (aaa) {
console.log("in main, response :" aaa);
console.log("in main, resolve result : " aaa);
return Promise.resolve(aaa);
});
}
console.log(" Top Level starts..");
main();
現在問題很明顯了:caller沒有return值。return它包含的唯一陳述句是在.then()回呼中,決議awaited的承諾,但之后沒有任何反應。為了解決這個問題,returnpromise 鏈而不是僅僅awaiting 它:
function caller() {
return loop().then(function (aaa) {
console.log("in caller, aaa: " aaa);
return Promise.resolve(aaa);
});
}
或者.then()當您可以在任何地方使用async/時最好不要使用鏈接await。您也可以省略函式或回呼中的Promise.resolve回傳值:async.then
async function loop() {
const aaa = "New";
console.log("in loop, start: " aaa);
await new Promise((resolve, reject) => setTimeout(resolve, 2000));
const bbb = "Message: I waited 2 sec.";
console.log("loop, finished output: " bbb);
return bbb;
}
async function caller() {
const bbb = await loop();
console.log("in caller:" bbb);
return bbb;
}
async function main() {
console.log("main start ...");
const res = await caller();
console.log("in main, response: " res);
// return res; // unused anyway
}
console.log("Top Level starts...");
main();
uj5u.com熱心網友回復:
伙計,你剛剛錯過了return來電。或者,你用await錯了。因為您使用await了結果,除非呼叫 return,否則不會回傳結果。
async function loop() {
let aaa = "New";
console.log("in loop, start aaa : " aaa);
await new Promise((resolve, reject) => setTimeout(resolve, 2000));
aaa = " Message: I waited 2 sec.";
return new Promise((resolve) => {
console.log("loop, finished output : " aaa);
resolve(aaa);
return;
});
}
async function caller() {
return await loop().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 3000));
console.log("in caller aaa :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 1500));
let bbb = aaa;
console.log("in caller, resolve aaa : " bbb);
resolve(bbb);
});
});
}
async function main() {
console.log("main start ...");
await caller().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 5000));
console.log("in main, response :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 6000));
console.log("in main, resolve result : " aaa);
resolve(aaa);
return;
});
});
}
console.log(" Top Level starts..");
main();
我建議你不要混合async使用.then,你應該選擇一個,并堅持下去。
我建議你放棄async/awaitin caller(),它更容易理解:
async function loop() {
let aaa = "New";
console.log("in loop, start aaa : " aaa);
await new Promise((resolve, reject) => setTimeout(resolve, 2000));
aaa = " Message: I waited 2 sec.";
return new Promise((resolve) => {
console.log("loop, finished output : " aaa);
resolve(aaa);
return;
});
}
function caller() {
return loop().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 3000));
console.log("in caller aaa :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 1500));
let bbb = aaa;
console.log("in caller, resolve aaa : " bbb);
resolve(bbb);
});
});
}
async function main() {
console.log("main start ...");
await caller().then(function (aaa) {
new Promise((resolve, reject) => setTimeout(resolve, 5000));
console.log("in main, response :" aaa);
return new Promise((resolve) => {
new Promise((resolve, reject) => setTimeout(resolve, 6000));
console.log("in main, resolve result : " aaa);
resolve(aaa);
return;
});
});
}
console.log(" Top Level starts..");
main();
如果你是一個新的學習者,我挑戰你嘗試重寫你的代碼,不要.then完全使用,然后反過來——根本不使用async/await。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352329.html
標籤:javascript 异步
上一篇:如何撰寫異步函式
