0

使用 seqalizerjs,解决一个承诺:

return new Promise(function(resolve, reject){
            return models.merchants.create({
                name: ctx.name,
            });
        }).then(function(result){
            resolve({
                id: result.id
            });
        }).catch(function(err){
            reject(err);
        });

以 chai 作为承诺进行测试

return user.save(data).should.eventually.equal('123123');

但我总是得到这个:

 Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure
 it resolves.
4

1 回答 1

0

我认为问题出在这一行:

return new Promise(function(resolve, reject){
        return models.merchants.create({
            name: ctx.name,
        });
        // .....

一个Promise函数应该有resolve(),像这样:

return new Promise(function(resolve, reject){
        resolve(models.merchants.create({
            name: ctx.name,
        }));

基于此参考

resolve 和 reject 函数绑定到 Promise,调用它们分别实现或拒绝 Promise。

还是根据参考,有Promise流程图: 在此处输入图像描述

then()or catch()afterPromise()不处理resolve()nor reject(),它们只处理从 or 传递的resolve()reject()

所以,我认为你的代码应该是这样的:

return new Promise(function(resolve, reject){
    resolve(models.merchants.create({
        name: ctx.name,
    }));
}).then(function(merchants){
    console.log(merchants) // the created `merchants` from the `resolve()` of the promise would be passed here.
    return merchants;
});

更新

您的代码应如下所示:

return new Promise(function(resolve, reject){
    models.merchants.create({ // assuming `models.merchants.create()` is an async method
        name: ctx.name,
    }).then(function(result){
        resolve({
            id: result.id
        });
    }).catch(function(err){
        reject(err);
});
于 2017-10-06T03:49:01.903 回答