2017-10-13 12 views
-1

解決:約束が混乱私は約束を解決すると、関数が実行され続けるべき

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     setTimeout(()=>{console.log(7)}, 2000} 
    }) 
} 

をそして私はこの

test().then(console.log); 

のような機能を呼び出すので、それは2の後に、その後5を印刷し、それは私が期待したように、7秒です。 しかし、私は(解決した後に同期の事で作業する場合)には、動作が異なります:

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
     for(let i = 0; i < 100; i++) 
      console.log(i) 
    }) 
} 

は、今では0から100までの数字を印刷し、その後、(それは5を出力します。しかし、私はそれが解決を通じて5を返すことが期待されます)残りのものをすべて印刷してください。

+0

いいえあなたは 'リターン決意(5)'行う必要があり、その後、あなたは何もしません。そうでなければ、なぜあなたは解決していますか? – yBrodsky

+0

@yBrodskyは真ではありません。明示的に返さずにresolveを使うことができます。 '戻る 'の唯一の重要なことは'新しい約束 'です。 – Andrew

+0

キーワードは必須です。約束の中で解決後に何かをやり続けたい実践的な例? – yBrodsky

答えて

-2

私は同じページにいることを確認したいと思っていました。 test関数のsetTimeoutは非同期です。はい、それは約束の中ですが、無制限にイベントループに送信しました。あなたはresolveに置くものは何でも

setTimeout(()=>{console.log(7)}, 2000} //not controlled in your first function

約束によって制御されます唯一のものです。あなたが約束を使用している方法は、彼らがどのように使用されるべきかではありません。このことがあなたを混乱させる場合は、基本に戻ってもう一度読む必要があります。

編集:私は正しく自分自身を明瞭に表現していないようで、かなりの塩を集めました。より良い説明:

あなたは返信文をどのように扱うべきですか?promise promise関数は、単一のresolveステートメント以外の出力操作は実行しないでください。これは、ファンクションの後続の操作で同期して制御することができます。キーワードは別です。

function test(){ 
    return new Promise(resolve=>{ 
     resolve(5) 
    }) 
} 

function loopTest() { 
    test().then((num) => { 
    console.log(num) 
    for (let i = 0; i < 10; i++) { 
     console.log(i) 
    } 
    }) 
} // what you were trying to actually accomplish 

loopTest() 
+0

ありがとうございます。しかし、申し訳ありませんが、私は非常にあなたが –

+0

「制御不能」の下に言おうとしているコールバックは同期しており、約束は非同期で実装されているので、明らかに – Andrew

-1

私はそれがjavascriptのevent loopと関係があると思います。このリンクで、JSのイベントループに関する素晴らしいビデオを見ることができます。 私は確信していませんが、resolve()は非同期に呼び出されますが、forループは同期されているようです。そのため、内部の解決策はキューに入れられ、forループは即座に実行されます。 "通常"の実行プロセスが終了した後、解決すると5を返します。

setTimeoutの例では、コードをキューに入れましたが、後で(2000ms)実行します。 5は何もしないので、すぐに(非同期的に)返され、2秒後にコードが実行されます。ビデオをWath。

1

コードは期待される結果を示します。すぐに5で解決すると、関数はまだ実行が終了していないので、残りのコードを実行します。実行が完了すると、呼び出しスタックは空になり、非同期のthenが実行されます。 2つのプログラムの違いは、2つ目のプログラムは、関数の実行が完了するのを待つ必要がないため、すぐにログに記録されることです。それは同期的です。

-1

私はそれを理解しました。Nodejsは左から右へコードを実行します。 まず、resolveとしてresolveを引数として渡してから、この関数を実行します。値を解決します。それから、同期forループが発生するため、同期を実行する必要があります。それから、私は方法を適用するという、すでに解決された約束を返します。then()は、約束が解決されたときにコールバックを実行します。既に解決済みです。そして、それはあなたがコールバックを使用している場合、それは違うだろう、私の解決された値 を出力します。

function test(callback){ 
    callback(7) 
    for(let i = 0; i<100; i++){ 
     console.log(i) 
    } 
} 

それは、最初の意志プリント(7)とだけにして、すべての残りの番号 しかし、それはあなたがコールバックがすることがわかっている場合にのみ機能します一度呼び出すことができます。そうでなければ、それは論理を破るでしょう。

+1

を更新@FureturPhyarell ..しかし、これは、あなたの質問に答えていないものを得ることはありません - それは最初のループ理由とその約束を解決する。 – aprok

+0

それはちょっと今、私は違いがあるため約束の実装 –

+0

の存在を知っているので、おそらく今、私はちょうど約束がなされている方法をGoogleに持っています –

関連する問題