2015-12-02 125 views
1

我想知道爲什麼BlueBird希望在承諾的回調中採取行動。像:藍鳥承諾和回調

var pr = new Promise(function(successCb, errorCb){ 
    // do what you need 
    successCb(); 
}); 
pr.then(function(){ 
    // react to promise resolved 
}); 

我預計將有一個類似的流程:

var pr = new Promise; 

// do what you need 
pr.resolve(); 
pr.then(function(){ 
    // react to promise resolved 
}); 

我不知道爲什麼,以避免回調的格局要我使用回調。這是否需要特定原因?

+1

是不是'' '新的Promise(...)'''只是callb的包裝器ack-like功能? Promisify可以爲你做所有的工作。 – Evers

+1

將操作代碼放在回調中允許在稍後的點執行並鏈接。簡而言之,它是一種依賴注入模式,可以隔離問題併爲長時間運行或嵌套順序操作提供靈活的「API」。這就是爲什麼「呼叫需要來自內部」,這樣外部世界只需要擔心已完成(不),而不是如何完成。 – dandavis

+1

你可以編寫你自己的lib,它會像你建議的那樣流動。事實上,我會試着去看看這樣一個安排帶來的侷限性,這應該讓你更深刻地理解爲什麼承諾會像他們一樣。 – dandavis

回答

0

承諾沒有避免回調,但(除其他外)阻止回調地獄,並使錯誤捕捉更容易。

doAsync1(params, function(err, res) { 
     if (err) { 
     throw new Error(err); 
     } 
     doAsync2(res1, function(err, res2) { 
     if (err) { 
      throw new Error(err); 
     } 
     doAsync3(res2, function(err) { 
      if (err) { 
      throw new Error(err); 
      } 
      // then do stuff 
     } 
     } 
    } 

...將被寫入像這樣在promisified土地:

doAsync1(params) 

    .then(function(res1) { 
    return doAsync2(res1); 
    }) 

    .then(function(res2) { 
    return doAsync3(res2); 
    }) 

    .then(function(res3) { 
    // Do something 
    }) 

    .catch(err) { 
    throw new Error(err); 
    }); 

你可以找到more details here

編輯:那麼你是對的:在同步碼,因此沒有回調,承諾是沒用的。

+0

我的問題是關於不同的事情。這是關於承諾所需要採取的行動。爲什麼它在回調中?我是對的,我無法解決這個回調之外的承諾? –

+1

如果您沒有回調,則不會有異步操作。承諾與異步操作有關,如上面鏈接的頁面中所述。 – Pandaiolo

+0

不:-)延期是。我已經搜索到它被認爲是反模式。但我想知道爲什麼。 –

0

A 回調是由另一個函數調用的任何函數,它將第一個函數作爲參數。它在該函數內的某個特定點處被「回調」。 雖然我們在談論JavaScript,但我們一直在處理回調。

你只是不能避免回調,它們是節點js庫的核心。它們實現了跨應用程序的平衡無阻塞控制流,它們幾乎是所有承諾庫的基礎。在你的代碼中,傳遞給函數的函數只是回調函數。

承諾實際上是一種與回調相同的效果。這裏的優勢是使得 使用回調非常愉快的抽象。

你可以通過這些鏈接,並得到了這些概念更好的保持:

  1. You are missing the whole point of promises

  2. Why move to promises

  3. Inside promise libraries