你能帮助我满足NodeJS中的承诺aplus规范2.2.4吗?

时间:2015-11-10 11:31:46

标签: node.js promise es6-promise

我正在为nodeJS编写HTTP Promises包。 我需要它是承诺aplus兼容。 我正在使用promises-aplus-tests - https://www.npmjs.com/package/promises-aplus-tests

我创建了一个适配器,如下所示..

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-34我的测试失败了...... 在https://promisesaplus.com/#point-67

上提供进一步的帮助
  

2.2.4 onFulfilled或onRejected在执行前不得调用   上下文堆栈仅包含平台代码

     

3.1这里“平台代码”意味着引擎,环境和承诺   实施代码。在实践中,这个要求确保了这一点   在事件发生后,onFulfilled和onRejected异步执行   循环转入然后调用,并使用新堆栈。这可以   使用“宏任务”机制(如setTimeout或)实现   setImmediate,或者使用“微任务”机制   MutationObserver或process.nextTick。自承诺实施以来   被认为是平台代码,它本身可能包含任务调度   队列或“trampoline”,其中调用处理程序。

但我无法通过此承诺aplus测试。我正在使用bog标准的JavaScript Promises库(它自己通过测试)记录在......

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

新承诺(遗嘱执行人);

新承诺(功能(解决,拒绝){...});

在遗嘱执行人中我试过......

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错误处理程序中有另一个拒绝的调用;

非常感谢

1 个答案:

答案 0 :(得分:0)

我想向Bergi道歉,我想我已经找到了我的愚蠢答案,但我很感激确认我现在的想法是正确的......

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

我正在编写一个类似但更强大的npm工具。 他们有"然后"徽章,显然我想要它! 我以为我需要通过你的测试(他们已经做了一些尝试)。 所以我试图通过你的承诺 - aplus-tests  使用我的库,它大量使用promises但不是promise实现。

我明白了...... https://www.npmjs.com/package/promises-aplus-tests

  

此套件测试承诺实施的合规性   承诺/ A +规范。

所以我现在意识到我的包裹不需要通过你的测试而且我不像我希望的那样聪明:)

但是,我正在运行测试以确保我们使用的Promise库在构建过程中传递测试。如果不是,则构建将失败。

我的代码现在......

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);
        });
    });
});

在构建过程中会触发一个grunt任务。

如果有人对我的新想法有任何想法。我很感激。

由于