2017-07-26 16 views
0

我正在閱讀YDKJS系列的Async &性能手冊,並且在展示構造函數模式時遇到了麻煩。JS承諾在YDKJS中揭示構造函數

下面是書中給出的例子:

function foo(x) { 
    // start doing something that could take a while 

    // construct and return a promise 
    return new Promise(function(resolve,reject){ 
    // eventually, call `resolve(..)` or `reject(..)`, 
    // which are the resolution callbacks for 
    // the promise. 
    }); 
} 

var p = foo(42); 

function bar(fooPromise) { 
    // listen for `foo(..)` to complete 
    fooPromise.then(
    function(){ 
     // `foo(..)` has now finished, so 
     // do `bar(..)`'s task 
    }, 
    function(){ 
     // oops, something went wrong in `foo(..)` 
    } 
); 
} 

bar(p); 

我有兩個問題:

  1. 我覺得意圖是不暴露的決心和拒絕的邏輯外,這將創建一個良好的承諾邏輯與在「監聽」Promise的函數(在這種情況下爲bar())中的.then()會發生什麼相關。我在這裏跟蹤?

  2. 該示例foo()讓我困惑。在評論// start doing something that could take a while,這究竟是什麼?這是你的異步電話會在哪裏?它不應該在return語句中的函數內嗎?我不明白這是否會起作用。

回答

1

我覺得意圖是不暴露的決心和拒絕的邏輯外,它創建一個值得關注的良好分離

是的,這和在deferred pattern捕捉異常的困難,一個另一種方法是隻將解析器公開給創建任務的函數,而不是那些使用結果的函數。

該示例foo()讓我困惑。在評論// start doing something that could take a while,這究竟是什麼?這是你的異步電話會在哪裏?

是的,這就是他們的意思。

它不應該在return語句中的函數內嗎?

是的,的確是應該的。一個具體的例子可能是

function delay(x) { 
    return new Promise(function(resolve) { // construct and return a promise 
    setTimeout(function() { // start doing something that could take a while 
     resolve(); // eventually, call one of the resolution callbacks 
    }, x); 
    }); 
} 

這當然可能是開始任務,並等待其結果是兩個單獨的語句,這樣他們就可以在理論上可以留出:

function ajax(x) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", x); 
    xhr.send(); // start doing something that could take a while 

    return new Promise(function(resolve, reject) { // construct and return a promise 
    xhr.onload = resolve; 
    xhr.onerror = reject; // eventually, call one of the resolution callbacks 
    }); 
} 

但是這是一個不好的做法,因爲當new,opensend扔你不會被拒絕的承諾,但一個例外。因此,從var xhr = …開始的所有內容都應該在promise構造函數回調中。

-1

對於2,一般而言,沒有進一步的細節,是的,你是正確的; resolver函數傳遞給Promise構造函數立即執行。一個例外是使用async/await,雖然async/await沒有出現在JavaScript的問題。

+0

爲了確保我清楚,你說我是正確的,你想要做的那些「需要一段時間」(ajax,setTimeout等)的任務應該在解析器('新的承諾(功能(解決,拒絕){//東西需要一段時間去這裏}') – Dan

+0

@丹是的,除非作者有理由在評論的那一行留下評論。評論意味着什麼以及爲什麼代碼中的評論位置是它的位置? – guest271314