假設我有這樣的代碼:
let result = {
name: downloadNameFromInternetVerySlow(),
isFamous: determineIfNameIsFamous(this.name);
}
const downloadNameFromInternetVerySlow = () => {
path = "/home";
const folders = fs.readdirSync(path).filter(file => fs.lstatSync(path).isDirectory());
console.log(folders);
return folders[0];
}
downloadNameFromInternetVerySlow可能需要很長時間,同時determineIfNameIsFamous取決于downloadNameFromInternetVerySlow的結果才能回傳正確的值。
如何確保determineIfNameIsFamous僅在downloadNameFromInternetVerySlow完成后運行?
uj5u.com熱心網友回復:
您顯示的代碼是完全同步的,因此異步結果實際上并不是人們猜測的問題。問題是this.name由于多種原因,不能用于參考物件字面定義中的先前屬性,其中最重要的this是未設定為您想要的物件。
相反,您可以這樣做:
let result = {};
result.name = downloadNameFromInternetVerySlow();
result.isFamous = determineIfNameIsFamous(result.name);
uj5u.com熱心網友回復:
您可以轉換downloadNameFromInternetVerySlow為 a Promise(如果還沒有)。然后用戶await等待它完成。否則你可以使用Promise.then()
(這應該在一個async函式內)
let name = await downloadNameFromInternetVerySlow(),
let isFamous = determineIfNameIsFamous(this.name);
let result = {
name,
isFamous
}
另一種方法使用 Promise.then
let name, isFamous;
downloadNameFromInternetVerySlow().then(result => {
name = result;
isFamous = determineIfNameIsFamous(this.name);
});
uj5u.com熱心網友回復:
異步/等待
有一種特殊的語法可以以更舒適的方式處理 promise,稱為“ async/await ”。
一個異步函式回傳一個承諾,就像在這個例子中:
const doSomethingAsync = () => {
return new Promise(resolve => {
setTimeout(() => resolve('I did something'), 3000)
})
}
當你想呼叫這個函式時,你需要在前面加上 await,呼叫代碼將停止,直到 promise 被解決或拒絕。一個警告:客戶端函式必須定義為異步。這是一個例子:
const doSomething = async () => {
console.log(await doSomethingAsync())
}
uj5u.com熱心網友回復:
假設downloadNameFromInternetVerySlow是異步的(否則它已經可以像您想要的那樣作業),解決方案是使用await.
請注意,為了能夠做到這一點,需要將此代碼包裝在一個async函式中(或頂級等待可用的頂級。)
async function getAndUseResult(){
let result = {
name: await downloadNameFromInternetVerySlow(),
isFamous: determineIfNameIsFamous(this.name);
}
console.log(JSON.stringify(result))
}
getAndUseResult();
uj5u.com熱心網友回復:
function downloadNameFromInternetVerySlow(){
return new Promise(resolve => setTimeout(() => {
console.log("Set timeout resolving...");
return resolve("Sample Name");
}, 5000))
}
function determineIfNameIsFamous(name){
if(name === "Sample Name"){
return true;
}
return false;
}
async function myFunc(){
let result = {};
result.name = await downloadNameFromInternetVerySlow();
console.log(result);
result.isFamous = determineIfNameIsFamous(result.name);
return result;
}
myFunc().then(res => console.log("result : ", res))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/381511.html
標籤:javascript 节点.js
