2016-09-28 8 views
-1

私はAPPの反応でES6約束をテストする、しかし、私は私の.thenになりませんしました:約束は、その後で結果/キャッチ

function addItem (value) { 
    return new Promise((resolve, reject) => { 
    document.getElementById('todo').innerHTML += `<li>${value}</li>`; 
    }); 
} 

addItem(value).then(() => { 
    alert('then !'); 
}).catch((err) => { 
    console.log(err) 
}) 

My機能が実行されますが、私は、その後のイベントいませんでした。

どこが間違っていたか知っていますか?ありがとうございました ! :)

+1

あなたの 'addItem'関数は非同期ではないので、' Promise'を返すべきではないでしょう。後で 'then'コールを連鎖できるようにしている場合は、' Promise.resolve(addItem(value))。then(...) 'で始めることができます。 – saadq

答えて

0

あなたの約束を拒否または解決する必要があります。

function addItem (value) { 
    return new Promise((resolve, reject) => { 
    document.getElementById('todo').innerHTML += `<li>${value}</li>`; 
    resolve(); 
    }); 
} 
+0

ありがとう!私はこれを追加しました: 'resolve(document.getElementById( 'todo')。innerHTML + ='

  • $ {value}
  • ');'それは正しいですか、後にresolve()を追加する必要がありますか? –

    +0

    それはうまくいくでしょう。 –

    0

    次の例のように、あなたの約束を解決する必要があります。

    function addItem (value) { 
        return new Promise((resolve, reject) => { 
        document.getElementById('todo').innerHTML += `<li>${value}</li>`; 
        resolve(10); 
        }); 
    } 
    
    addItem(value).then((data) => { 
        alert('then !'); 
        console.log(data);// 10 
    }).catch((err) => { 
        console.log(err) 
    }) 
    
    1

    約束は、非同期タスクのために使用されています。同期コードを実行するためにそれらを使用することに意味はありません。あなたの例では、約束を解決することがないため、then()は動作しません。それを解決するには、resolve()に電話する必要があります。

    +0

    本当ではありません。非同期APIを公開する場合は、同期タスクに約束を使用できます。そうすれば、後で非同期実装に切り替えることができます。 –

    +1

    @ JakubHamplはい、それはまれなユースケースです。このような状況では、Promiseのコード全体をラップするのではなく、単に 'Promise.resolve()'を返すほうがよいでしょう。 –

    0

    Promiseでresolverejectの機能を呼び出すことを忘れました。

    resolveは、操作が完了したら電話する機能です。

    resolve(); 
    

    あなたはresolve()に渡す引数は、あなたが戻ってthen機能で取得されるものです。

    rejectは、あなたの行動にエラーがあるときに電話する機能です。あなたが拒否する何も持っていなければ、あなたはそれを放置することができ、あなたはそれを呼び出す必要はありません。

    reject(); 
    

    あなたはreject()に渡す引数は、あなたが戻ってcatch機能で取得されるものです。

    関連する問題