2017-05-26 55 views
0

我有一個異步函數sayHello()被稱爲內部greeting()功能:構建一個承諾沒有分解或拒絕

function greeting() { 
    let P = new Promise(); 
    sayHello().then(function(){ 
     //manipulate DOM 
     P.resolve(); 
    }).catch(function(error)){ 
     //manipulate DOM 
     P.reject(); 
    }); 
    return P; 
} 

我想greeting()返回一個承諾,所以當sayHello的工作是調用者就知道完了。但是這段代碼似乎並不正確,因爲它說Promise在構建時應該有resolvereject函數。我該怎麼辦 ?

+2

不要這樣做。相反,請直接返回您的承諾鏈。如果你已經有承諾,你永遠不需要'新的Promise()'。 – SLaks

+0

我不想在問候語的調用者中操縱DOM,我想在問候語中做它。 –

+0

這不會改變任何東西。您仍然可以退回承諾鏈。 – SLaks

回答

3

剛返回由sayHello()返回Promise

function greeting() { 
    return sayHello().then(function(){ 
    //manipulate DOM 
    }).catch(function(error)){ 
    //manipulate DOM 
    }); 
} 

then method回報的承諾。 下面是一個簡單的fiddle說明這一點。

+0

'greeting'輸出一個承諾(結果,'greeting'的調用者可以使用它並調用'then')。那麼,「那麼」總是回報一個承諾?即使我們不「返還」任何東西? –

+1

@ArianHosseinzadeh是的,'.then()'返回一個新的'Promise'對象 – guest271314

+0

重要的是,如果你有一個'.catch()'處理程序不會重新拋出或返回被拒絕的承諾,將被切換到已解決的狀態(就像try/catch中的catch塊阻止異常向上傳播一樣)。因此,顯示的內容永遠不會告訴調用者「sayHello()」失敗。 – jfriend00

0
async function greeting() { 
    let response 
    try { 
    response = await sayHello() 
    } catch(err) { 
    response = err 
    } 
    return response 
} 

greeting().then(response => console.log(response)) 

function greeting2() { 
    return new Promise((resolve, reject) => { 
    sayHello().then(_ => { 
     //manipulate DOM 
     resolve() 
    }).catch(err => { 
     //manipulate DOM 
     reject() 
    }) 
    }) 
} 

greeting2().then(_ => console.log('something')) 
0

其他的答案提供了良好的解決方案,但你看到的錯誤的實際原因:無極應該有決心,拒絕被創建時定義的功能。是您正在使用的具體的Promise實施。最新版本預計在調用時,它的「執行者」的功能作爲第一個參數:

new Promise(/* this is the executor: */ function (resolve, reject) { ... }); 

您可以在這裏看到的規格:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

舊版本的Promise沒有遵循相同的規範。