2016-09-28 92 views
-1

我測試ES6無極反應APP,但我已經不是我的。後來的結果是:執行承諾與當時產生/捕獲

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) 
}) 

我的功能,但我沒有事件對我呢。

你知道我錯了嗎?謝謝 ! :)

+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.resolve()',而不是將整個代碼包裝在Promise中。 –

    0

    你忘了在Promise中致電resolvereject函數。

    resolve是您在完成操作後調用的函數。

    resolve(); 
    

    ,你傳遞給resolve()的說法就是你回到then功能。

    reject是您在動作發生錯誤時調用的函數。如果您沒有任何要拒絕的東西,那麼您可以將其保留,而不必再打電話給它。

    reject(); 
    

    你傳遞給reject()的說法就是你回到catch功能。