2016-09-28 35 views
9

承諾和AJAX調用都是異步操作。兩者都可以進行GET/POST請求。 < < 編輯:這是一個錯誤的說法Promise和AJAX有什麼區別?

那麼它們之間有什麼區別?什麼時候最好使用一個而不是另一個?

此外,還有一兩件事:

最近我遇到了一個承諾,其中有一個AJAX在它的身上。爲什麼在異步操作中放置異步操作?這就像把麪包放在麪包三明治裏。

編輯:我的道歉不早提供一個例子:

function threadsGet() { 
return new Promise((resolve, reject) => { 
    $.getJSON('api/threads') 
    .done(resolve) 
    .fail(reject); 
    }) 
} 

jQuery是用在這裏。 AJAX調用具有Promise行爲和屬性。我沒有早點得到,但這裏是我的想法: 我們可以在Promise中做點什麼。然後使用AJAX調用並在done函數中傳遞已解析的Promise邏輯。特別是在這個例子中沒有。

現在我明白了我對兩者的困惑。他們幾乎是兩件不同的事情。僅僅因爲它們是異步的,並不意味着它們是可以互換的。

==============

編輯2:只是一些材料,我發現有用:

Promise Anti-Patterns

+0

能否請您澄清當你說你可以用_promise_做出GET/POST請求時,你的意思是什麼? –

+2

承諾本身沒有制定GET/POST請求的機制。也許閱讀[Promises文檔](http://stackoverflow.com/documentation/javascript/231/promises/846/introduction#t=201609281521002304613)? –

+2

Promise是用於異步操作的*接口*。 ajax請求是一個非常特定的異步操作。 – Bergi

回答

24

你感到困惑的承諾和Ajax調用。它們有點像蘋果和刀子。你可以用刀切蘋果,刀是可以應用於蘋果的工具,但這兩者是非常不同的東西。

承諾是管理異步操作的工具。他們會跟蹤異步操作何時完成以及結果如何,並讓您與其他代碼或其他異步操作協調完成以及這些結果(包括錯誤條件)。它們本身並不是實際的異步操作。 Ajax調用是一種特定的異步操作,可以與傳統的回調接口一起使用或包裝在承諾接口中。

那麼他們之間有什麼區別?什麼時候最好使用 而不是另一個?

Ajax調用是一種特定類型的異步操作。您可以使用XMLHttpRequest interface與傳統回調進行Ajax調用,也可以使用fetch() interface的承諾進行Ajax調用(在現代瀏覽器中)。

最近我遇到了一個承諾,它的主體中有一個AJAX。爲什麼 在異步操作中放置異步操作?這就像在一個麪包三明治裏面放一塊麪包麪包 。

你沒有告訴你在談論具體的代碼,但有時你想開始異步操作1,然後當異步操作完成後,要他們開始異步操作2(通常使用效果的第一個)。在這種情況下,你通常會在另一箇中嵌套一個。


你的代碼示例在這裏:

function threadsGet() { 
    return new Promise((resolve, reject) => { 
     $.getJSON('api/threads') 
     .done(resolve) 
     .fail(reject); 
     }) 
} 

被認爲是一個承諾的反模式。沒有理由在此創建新的承諾,因爲$.getJSON()已返回您可以返回的承諾。你可以做這個:

function threadsGet() { 
    return $.getJSON('api/threads'); 
} 

或者,如果你想「投」有點不標準的jQuery承諾標準的承諾,你可以這樣做:

function threadsGet() { 
    return Promise.resolve($.getJSON('api/threads')); 
} 
+0

謝謝!用Promise中的AJAX示例更新了我的問題。我已經有了它的想法。 :) – Bruno

+0

非常感謝您的更新!我甚至不知道承諾有好的/不好的做法。我喜歡你的優化代碼。它更容易理解和優雅。在我發佈的代碼中,讓我感到困惑的事情是 - Ajax解決了外部承諾的成功以及(最終)失敗的錯誤。但現在很清楚。 :) – Bruno