2015-12-24 173 views
1

如何解決外部異步函數askIfUserIsAMinor與用戶回答對話框提示後用戶的次要狀態(真/假)的布爾值?例如:如何從內部函數中解析外部異步函數

async function askIfUserIsAMinor() { 
    let dialogButtons = [ 
    { 
     text: "Yes", 
     onPress:() => { 
     // I want to return 'false' on the outer async function 
     } 
    }, 
    { 
     text: "No", 
     onPress:() => { 
     // I want to return 'true' on the outer async function 
     } 
    } 
    ]; 
    dialog.prompt("Are you above the age of 18?", dialogButtons); 
} 

let userIsAMinor = await askIfUserIsAMinor(); 
if (userIsAMinor) { 
    // let user proceed 
} else { 
    // show something else 
} 

是的,還有很多其他的方法來解決這個問題,而異步/ AWAIT,但我的使用情況比這要複雜得多,這只是一個簡單的場景。在ES6中,這可以通過使askIfUserIsAMinor返回一個承諾並使內部onPress函數在外部承諾上調用resolve來解決。

+0

使用了'await'錯誤......我會一直期望看到'回報伺機dialog.prompt(...' - 雖然,不知道wh在對話框或dialog.prompt代碼甚至看起來像,很難說 –

+0

我已經擴大了評論 –

+0

可以說對話框就像一個庫方法,顯示提示,並在按下時調用每個按鈕的附加功能。我們不能修改dialog.prompt到一個'await''''異步函數'。 –

回答

2

此代碼實際上正常工作 - promisify dialog.prompt,然後你等待在async function testMinor諾言 - 我早先發布的代碼落在了同樣的陷阱,其他人總是墮落,思考某種方式可以使異步代碼同步...

function askIfUserIsAMinor() { 
    return new Promise(function(resolve) { 
     let dialogButtons = [{ 
      text: "Yes", 
      onPress:() => resolve(true) 
     }, { 
      text: "No", 
      onPress:() => resolve(false) 
     }]; 
     dialog.prompt("Are you above the age of 18?", dialogButtons); 
    }); 
} 
async function testMinor() { 
    let userIsAMinor = await askIfUserIsAMinor(); 
    if (userIsAMinor) { 
     // let user proceed 
    } else { 
     // show something else 
    } 
} 

async function askIfUserIsAMinor() { 
    let userIsAMinor = await new Promise(function(resolve) { 
     let dialogButtons = [{ 
      text: "Yes", 
      onPress:() => resolve(true) 
     }, { 
      text: "No", 
      onPress:() => resolve(false) 
     }]; 
     dialog.prompt("Are you above the age of 18?", dialogButtons); 
    }); 
    if (userIsAMinor) { 
     // let user proceed 
    } else { 
     // show something else 
    } 
} 
askIfUserIsAMinor(); 
+0

它工作嗎?說實話,我猜根據我有限的ES2016/ES7閱讀 - 仍然追趕ES2015/ES6 –

+0

理論上它應該。現在進行測試。只是有點惱火,ES7異步/等待應該被用作對ES6承諾的改進,但是當更復雜的情況出現時,我們必須回到承諾。 –

+0

@GeoffreyGoh - 編輯答案 - 上面應該可以工作,但也許不是你想要的 –

相關問題