承诺不要在外面泡沫

时间:2017-04-10 08:45:30

标签: javascript node.js callback promise mocha

我需要使用Mocha测试函数testMe。但是当我的单元测试发生错误时会出现问题。这是简单的例子

function testMe(callback) {
    new Promise((resolve, reject) => {
        setTimeout(() => resolve([1,2,3]), 1000);
    }).then((result) => {
        callback(null, result);
    }).catch((error) => {
        callback(error, null)
    });
}

testMe((err, result) => {
   if(err) throw new Error();
   if(result.length < 5) throw new Error();
});

在此示例中,throw运行后捕获块。但我只有在拒绝后才需要运行catch块。

编辑:

在这种情况下,脚本永远不会停止。我不明白为什么。

function testMe(callback) {
    new Promise((resolve, reject) => {
        setTimeout(() => resolve([1,2,3]), 1000);
    }).then((result) => {
        callback(null, result);
    }, (error) => {
        callback(error, null)
    }).catch(() => {
        console.log('Do not throw an error but still running');
    });
}

testMe((err, result) => {
   if(err) throw new Error();
   if(result.length < 5) throw new Error();
});

2 个答案:

答案 0 :(得分:2)

当你使用promises时,然后从函数返回promises而不是回调。

例如,而不是:

function testMe(callback) {
    new Promise((resolve, reject) => {
        // ...
    });
}

使用:

function testMe(callback) {
    return new Promise((resolve, reject) => {
        // ...
    });
}

通过这种方式,你可以为函数的调用者提供承诺。

如果你需要混合两种风格,即返回承诺和回调,请考虑使用可靠的库来处理这种情况,特别是如果你自己在这些风格之间编译翻译时遇到问题:

答案 1 :(得分:1)

您可以简单地return the promise from the test

function testMe() {
//             ^^ drop the callback
    return new Promise((resolve, reject) => {
//  ^^^^^^ return the promise
        setTimeout(() => resolve([1,2,3]), 1000);
    });
}

var p = testMe().then(result) => {
//              ^^^^^ use the promise
   if(result.length < 5) throw new Error();
});
return p; // to mocha