2015-11-10 46 views
0

我正在爲nodeJS寫一個HTTP Promises包。 我需要它承諾aplus兼容。 我使用的承諾,Aplus的檢驗 - https://www.npmjs.com/package/promises-aplus-tests你能幫助我滿足NodeJS中的aplus spec 2.2.4嗎?

我已經創建了一個適配器如下..

var adapter = { 
     deferred: function() { 
      var d = {} 
      d.promise = new HTTPromise(new GETOptions('/path', DEFAULT_OPTIONS)); 
      d.resolve = executorResponseFunc; 
      d.reject = executorRejectFunc;   
      return d; 
     } 
    } 

promisesAplusTests(adapter, function (err) { 
    done(err); 
}); 

我的測試是在https://promisesaplus.com/#point-67

failin上 https://promisesaplus.com/#point-34 ... 進一步幫助

2.2.4 onFulfilled或onRejected在執行之前不得調用 上下文堆棧僅包含平臺代碼

3.1這裏的「平臺代碼」表示引擎,環境,並承諾 執行代碼。在實踐中,這個要求確保了onFulfilled和onRejected異步執行,在事件 循環調用之後被調用,並且具有新的堆棧。這可以是使用諸如setTimeout或 setImmediate之類的「宏任務」機制或者使用諸如 MutationObserver或process.nextTick之類的「微任務」機制來實現的 。由於承諾實現 被視爲平臺代碼,因此它本身可能包含調度處理程序的任務調度隊列或「蹦牀」。

但我無法讓它通過這個承諾aplus測試。我現在用的沼澤標準的JavaScript庫的諾言(其自身通過測試)在記錄......

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise

新的承諾(執行);

new Promise(function(resolve,reject){...});

在我試圖執行...

if (response.statusCode === 200) { 
    process.nextTick(() => { 
     resolve(finalResponse); 
    }); 
} else { 
    process.nextTick(() => { 
     reject(finalResponse); 
    }); 
} 

,也...

process.nextTick(() => { 
    if (response.statusCode === 200) { 
     resolve(finalResponse);  
    } else { 
     reject(finalResponse); 
    } 
}); 

似乎有一個談了很多在互聯網上,但如何沒有多少代碼示例遵守。任何人都可以提供一個代碼示例請如何滿足這個測試,以及如何使用nextTick或其他合適的解決方案?

值得一提的是我有另一個調用來拒絕執行程序函數內的HTTP錯誤處理程序;

非常感謝

+2

你爲什麼寫自己的承諾庫,而不是簡單地使用一個現有的(幷包裝HTTP的東西)?或者如果你已經在使用內建'Promise',爲什麼你要運行aplus測試呢?沒有理由使用'nextTick'和一個兼容的'new Promise'構造函數。 – Bergi

+0

'executorResponseFunc'和'executorRejectFunc'來自哪裏?! – Bergi

+0

你能告訴我你的完整代碼嗎?我不知道你在做什麼,或者HTTPPromise應該解決什麼問題。 – Bergi

回答

0

我想道歉BERGI,我想我找到了答案,以我的愚蠢,但我希望確認我的想法是正確的,現在...

我最初的困惑來自何方... https://www.npmjs.com/package/request-promise

我正在寫一個類似但功能更強大的npm工具。 他們有「那麼」徽章,所以顯然我想要它! 我以爲我需要通過你的測試(他們已經做了一些嘗試)。 所以我試圖通過你的承諾,aplus測試 與我的庫,它使用承諾大量,但不是承諾實現。

我看到... https://www.npmjs.com/package/promises-aplus-tests

這間套房測試與 承諾/ A +規格承諾實現的合規性。

所以我現在意識到,我的包並不需要通過你的測試,我不聰明,因爲我可能希望:)

不過,我運行一個測試,以確保承諾庫我們在構建過程中使用通過測試。如果它不會失敗。

我的代碼現在...

class HTTPromise { 
    constructor(options) { 
     ... blah blah blah 
     let executor = THE_REAL_EXECUTOR; 
     return AppPromise(executor); 
    } 
} 

class HTTPromiseCompliance { 
    constructor(executor) { 
     return AppPromise(executor); 
    } 
} 

AppPromise看起來像......

module.exports = executor => { 
    return new Promise(executor); 
} 

最後測試套件...

describe('HTTPromises', function() { 

    it('should use a Promises/A+ compliant Promise library', function (done) { 
     this.timeout(0); 
     var adapter = { 
      deferred: function() { 
       var d = {} 
       var executor = function(resolve, reject) { 
        d.resolve = resolve 
        d.reject = reject 
       }; 
       d.promise = new HTTPromiseCompliance(executor); 
       return d 
      } 
     } 

     promisesAplusTests(adapter, function (err) { 
      if (err != null) { 
       console.log('promises Aplus Tests failed with ' + err.failures + ' failures'); 
      } else { 
       console.log('promises Aplus Tests passed');     
      } 
      done(err); 
     }); 
    }); 
}); 

咕嚕任務這是在構建過程中被觸發的。

如果有人對「我的新思維」有任何想法,我會很感激。

謝謝

+1

'request-promise'不要「擁有」當時的徽章 - 不是承諾庫。他們只是用它來表明他們返回合規承諾。 – Bergi

+0

好的非常感謝 – danday74