0

我正在尝试在 NodeJs 中使用 bluebird promises 和 nano 一个与 couchDb 一起使用的库。我使用了 promisfy,当我看到新的异步方法时。在下面的示例中,nano.db.listAsync调用运行良好,但我从未到达 .then 或 .catch。

这里有什么问题?

   var nano = require('nano')(this.appInfo.dbServiceUrlPrefix);
        Promise.promisifyAll(nano);
        Promise.promisifyAll(nano.db);

       var p = nano.db.listAsync(function(err,body) {
            // get all the DBs on dbServiceUrlPrefix
            var dbNames:string[] = <string[]> body ;
            console.log("allDbs",dbNames) ;
            return dbNames ;
        }).then(function (e:any) {
            console.log('Success',e);
        }).catch(function(e:any){
            console.log('Error',e);
        });

4

2 回答 2

2

有几件事是错误的。

  1. 在 promisification 并调用 promsified 版本之后,您使用.then()来获取结果。
  2. .then()解析处理程序不再有变量err。如果有错误,.then()则调用拒绝处理程序。

所以,我认为你想要这样的东西:

   var nano = require('nano')(this.appInfo.dbServiceUrlPrefix);
   Promise.promisifyAll(nano);
   Promise.promisifyAll(nano.db);

   nano.db.listAsync().then(function(body) {
        // get all the DBs on dbServiceUrlPrefix
        var dbNames:string[] = <string[]> body ;
        console.log("allDbs",dbNames) ;
        return dbNames;
    }).then(function (e:any) {
        console.log('Success',e);
    }).catch(function(e:any){
        console.log('Error',e);
    });

PS你确定不应该有任何函数参数传递给nano.db.listAsync()吗?

于 2016-05-01T05:21:19.740 回答
0

我认为您传递给的函数参数nano.db.listAsync()不正确。承诺后它不会有err参数,所以你的代码应该是这样的:

var nano = require('nano')(this.appInfo.dbServiceUrlPrefix);
    Promise.promisifyAll(nano);
    Promise.promisifyAll(nano.db);

    var p = nano.db.listAsync(function(body) {
        ...
于 2016-05-01T03:20:17.340 回答