2017-07-11 24 views
1

我是Angular2編程的初學者。我正在嘗試編寫一個返回自定義承諾的函數。它看起來像這樣:在Angular中解析定製承諾(2-4) - 是否新增

removeItem(item, removeFile: boolean = true): Promise <any> { 
     // remove the item from the list 
     let index = this.items.indexOf(item); 
     if (index > -1) { this.items.splice(index, 1); } 
     // now if removeFile is true, also physical remove the image 
     if (removeFile) { 
     // file.removeFile is basically cordova's file removeFile that returns a promise 
     return file.removeFile(file.dataDirectory, item.photo[i]); 
     } 
     else { // return my own promise so its consistent 
     return Promise.resolve(); //<---- *THIS* 
     } 

} 

我有這個問題是行註釋爲*THIS*在底部。我見過的每個例子都有一個var p = new Promise(resolve, reject)one許多例子)。

問題:

1)爲什麼我需要這樣做?上面的方法似乎工作。我讀this SO thread,它回答了另一個承諾框架,但我無法繞過它。任何人都可以爲我解析嗎?

2)如果我必須做一個p = new Promise,我不想把我的全部功能都包含在它的函數中,就像例子顯示的那樣。我可以在需要的地方做一個返回p.resolve()和p.reject(),所以我不添加到嵌套中?

3)潛水多一點成什麼@Maximus說:

你需要一個新的承諾,只要有你想 一些異步工作完成,然後要麼解決或拒絕承諾

爲什麼我不能使用相同的方法和上面(即使用Promise.resolve/reject)?舉例來說,可以說我逼上file.removeFile定製的承諾(我知道這是不好的,但我只是想了解爲什麼我需要異步工作的新承諾)

if (removeFile) { 
     file.removeFile(file.dataDirectory, item.photo[i]) 
     .then ({success=>return (Promise.resolve(success);}, 
       {error=>return (Promise.reject(error);}); 
     } 

編輯:爲了澄清,我非常清楚,我不需要用我自己的承諾來包裝removeFile。這只是舉一個例子,用我自己的承諾來包裝一個異步作業,但不使用new Promise換句話說,我可以從一個異步作業的例子中學習,這個例子需要我做一個new PromisePromise.resolve會導致問題嗎?

謝謝。

回答

1

爲什麼我需要做的是什麼?上面的方法似乎工作。

你不需要它。你的變種:

return Promise.resolve(); 

絕對沒問題。你的代碼中使用:

Promise.resolve(value) 

是那種一個別名爲

new Promise((resolve)=>{resolve(value)}) 

你需要一個new Promise只要有您要執行一些異步工作,然後要麼解決或拒絕承諾。例如,解決1許諾第二使用setTimeout

new Promise((resolve)=>{setTimeout(()=>{resolve(value)}, 1000)}) 

編輯:

你不需要在這裏使用Promise.resolve()

file.removeFile(file.dataDirectory, item.photo[i]) 
.then ({success=>return (Promise.resolve(success);}, 
     {error=>return (Promise.reject(error);}); 

這是相同的:

file.removeFile(file.dataDirectory, item.photo[i]) 
+0

Thanks Maximus。我編輯了我的原始問題,以便爲即使異步工作爲什麼需要新的承諾添加進一步的問題 – user1361529

+0

@ user1361529,您可能必須瞭解許諾如何工作。我在你的更新中添加了關於我的答案的細節。 –

+0

@Maximus如果你提供了一些鏈接來了解承諾是如何工作的,那麼這將是非常棒的。 – yurzui