2017-08-07 16 views
1

ここに問題があります - 私は関数を呼び出し、オプションでダイアログを複数回表示し、ユーザーがOKを押すのを待ちます。その後、私は何か他のことをしたい。javascriptを使用する非同期に

ソリューションにはPromiseを使用する必要があると思います。しかし、dialog.alert()呼び出しの非同期性は、私を捨ててしまいます。

function a() 
{ 
if (condition_ok) 
{ 
    // there could be multiple dialogs 
    // 
    for (int i = 0; i < 2; ++i) 
     dialog.alert("press ok").then (()=> { console.log("done"); }); 
    } 
} 
a(); 
// call b() after all the dialogs have been closed in a() 
b(); 
+0

'for(int i = 0; i <2; ++ i) '... int? –

+0

は擬似コードであるはずです...これは、複数の言語を同時に扱っているときに起こります。 – dashman

答えて

3

ことを行うことができる方法であります各ダイアログは、私はあなたのコードは

を意図したものであると考えている、「閉じる」ために、以前のを待ちます:@ guest271314で)次の代わりに

function a() { 
    var p = Promise.resolve(); 
    if (condition_ok) { 
     // there could be multiple dialogs 
     // 
     for (var i = 0; i < 2; ++i) { 
      p = p 
      .then(() => dialog.alert('press ok')) 
      .then(() => { 
       console.log('done'); 
      }); 
     } 
    } 
    return p; 
} 
a().then(b); 

注意を使用することができます

+0

oops、silly typo –

+0

構文上の問題があるようですので、これを試しませんでした。また、p = pは何ですか? – dashman

+0

。次の行に移動します。私は約束を結ぶ私の道を持っている –

0

あなたはasync/awaitまたはPromise.all()Array.prototype.map()

async function a() { 
    if (condition_ok) { 
    // there could be multiple dialogs 
    // 
    for (let i = 0; i < 2; i++) { 
     let curr = await dialog.alert("press ok"); 
     console.log("done"); 
    } 
    } 
    return 
} 
// call b() after all the dialogs have been closed in a() 
a().then(() => b(), err => console.error(err)); 
+0

async/awaitの初めてのヒアリング - ほとんどサポートされていない可能性があります。しかし、ありがとう。 – dashman

+0

@dashman https://stackoverflow.com/questions/42183155/is-it-safe-to-use-async-await-now、https://caniuse.com/#search=await – guest271314

0

使用Promise.all()を使用することができます。

let targets = [] 
for (let i = 0; i < 2; i++) { 
    targets.push(dialog.alert('press ok')) 
} 
Promise.all(targets).then(([result1, result2]) => { 
    b(); 
}) 
+0

ありがとうございます - 期待通りに動作します - 'for'ループが入力されていなくても。 – dashman

0

あなたが直面している問題は、あなたがbを呼び出す前に行われなければすべてあなたの非同期alertのを待つ必要があるということです。すべての非同期呼び出しを配列に格納してからPromise.all()を使用して、すべてがbを呼び出す前に完了していることを確認することができます。ここでは、(あなたのコードは、あなたが示唆)矢印の機能を持っていますが、優れた答えである(async/awaitをサポートしていない環境にある場合は、

// Faking data/objects - START 
 
const condition_ok = true; 
 
const dialog = { 
 
    alert() { 
 
    return new Promise((resolve, reject) => { 
 
     resolve("Done"); 
 
    }) 
 
    } 
 
} 
 
const b =() => { 
 
    console.log("Call b()") 
 
} 
 
// Faking data/objects - END 
 

 
function a() { 
 
    let promises = []; 
 
    if (condition_ok) { 
 
    for (let i = 0; i < 2; ++i) { 
 
     promises.push(dialog.alert("press ok").then(() => { 
 
     console.log(`Done with alert() for ${i}`); 
 
     })); 
 
    } 
 
    } 
 
    return promises; 
 
} 
 

 
Promise.all(a()).then(results => { 
 
    // call b() after all the dialogs have been closed in a() 
 
    b(); 
 
});

+0

a()はcondition_okの未定義を返します。 – dashman

+0

あなたはそうです。それを逃した。コードを編集しました。 –

関連する問題