2016-11-13 169 views
1

我將一些數據保存到我的Polymer元素中的Firebase數據庫中。一切正常。但是,因爲我對Promises是新手的人,我需要幫助來了解在方法結束時什麼是Promise.resolved()。在使用.then之前,這個承諾是不是經過了?那麼究竟是在做什麼呢?我看了around,但找不到沒有價值的resolved()的例子。需要幫助瞭解此承諾並處理錯誤

我怎樣才能改變這種有如下比較熟悉的結構:

.then(function(snapshot) { 
    // The Promise was "fulfilled" (it succeeded). 
}, function(error) { 
    // The Promise was rejected. 
}); 

這裏的街區,距離documentation採取Promise.resolved()

saveData : function() {   
      this.$.document.data = this.$.message.value; 
      this.$.document.save("/parent", "child").then(function() { 
      console.log('sent the event!!!!!!'); 
      this.$.document.reset(); 
      }.bind(this)); 

     return Promise.resolve(); 
     }, 
+0

除了你所問,你似乎也有一個範圍問題。外部函數和內部函數中的'this'可能會有所不同,並且'this。$。document.reset();'可能會拋出。 –

+0

@ Roamer-1888 - 這就是爲什麼有'.bind(this)'。 – jfriend00

+0

哎呀,高級時刻!感謝您發現@ jfriend00。 –

回答

4

首先,您需要了解Promise的基礎知識。

允許用戶從基礎做起 -

新創建的ES6承諾在下列狀態之一:

  • 解決
  • 拒絕
  • 掛起 - >等待解決或拒絕

讓我們創建一個示例Promise

var promise = new Promise(function(fulfill, reject) { 
    // Do some stuff and either fullfill or reject the promise 
}); 

所以上述承諾收到回調函數也被稱爲執行函數簽名function(fullfill, reject)

新創建的promise還有一個非常重要的屬性函數,稱爲then,用於鏈接和控制邏輯流。

then需要兩個可選的回調參數onFulfilledonRejected

這裏面執行功能兩件事情恰好說明承諾的結果 -

  • fullfill方法被調用帶或不帶值:

    意味着操作成功完成。如果你打電話履行然後onFulfilled回調then將接收到的值,如果你決定不fulfill調用隨後onFulfilled將與參數undefined被稱爲提供價值。

    var promise = new Promise(function(fulfill, reject) { 
        // lets assume operation completed successfully 
        fulfill('Success'); 
    }); 
    
    promise.then(onFulfilled, onRejected); 
    
    function onFulfilled(result) { 
        console.log(result); 
        // Success will be printed 
    } 
    
  • reject方法被調用帶或不帶值:在執行操作時發生
    一些問題。您可以決定是否通過一些錯誤消息reject回調來指示最終用戶發生的錯誤。

    var promise = new Promise(function(fulfill, reject) { 
        // lets assume operation did not complete successfully 
        reject(new Error('Error')); 
    }); 
    
    promise.then(onFulfilled, onRejected); 
    
    function onRejected(error) { 
        console.log(error.message); 
        // Error message will be printed 
    } 
    

現在讓我們談談Promise.resolve

頂部你學會了如何通過構造函數創建promise。

var promise = new Promise(function (fulfill, reject) { 
    fulfill('Success value'); 
}); 

// Now: Promise.resolve 
// Exactly does the same thing as above code 

var promise = Promise.resolve('Success value'); 

同樣來自Promise.reject -

var promise = new Promise(function (fulfill, reject) { 
    reject(new Error('Error VALUE')); 
}); 

var promise = Promise.reject(new Error('Error VALUE')); 

在你的情況save看來,承諾可致電或者fulfillreject方法是已經和國內返回一個承諾,所以你並不需要調用Promise.resolve() 。您只需獲取該承諾返回的值即可,其值爲fulfilled,或then方法中的值爲rejected

saveData : function() {   
     this.$.document.data = this.$.message.value; 
     // return this promise 
     return this.$.document.save("/parent", "child"); 
} 

saveData() 
.then(function() { 
     console.log('sent the event!!!!!!'); 
     this.$.document.reset(); 
     }.bind(this)); 

我希望它使有關承諾的事情更清晰。

+1

非常感謝@WitVault,我希望我得到的所有答案都是這樣的:P我對Promise.resolved()有懷疑,並且它可能是多餘的。有趣的是,這是從firebase文檔中取得的,這讓我有點猶豫,說它是無用的。但是你的解釋似乎很有道理。我會稍等一下,看看是否有人有任何其他的輸入,但很可能這是被接受的答案。乾杯! – TheeBen

+0

更好的說,這是在Polymer的文檔中 – TheeBen

+0

@TheeBen你有任何其他的答案嗎? – WitVault

1

如果你想成爲能夠做obj.saveData().then(...),那麼你可以返回這樣的內心承諾:

saveData : function() {   
     this.$.document.data = this.$.message.value; 
     // return this promise 
     return this.$.document.save("/parent", "child").then(function() { 
     console.log('sent the event!!!!!!'); 
     this.$.document.reset(); 
     }.bind(this)); 
} 
+0

感謝您的回覆,我基本上在嘗試瞭解「Promise.resolve()」在此之前的意思。在我看來,承諾已經過去了,然後我回過頭來,這意味着我不確定。然後我會在哪裏處理錯誤.. – TheeBen

+1

@TheeBen - '返回Promise.resolve()立即返回一個已解決的承諾,它與異步操作沒有任何聯繫,因此它沒有做任何有用的事情 - 它不屬於這個環境。即使在異步操作完成之前,它已經解決了。正如我的答案所示,您想要返回與異步操作相關的承諾。 – jfriend00

+0

有趣的是,它在Firebase文檔中,並不是說它們是錯誤的..只是讓我想知道...感謝您的評論,儘管 – TheeBen