Bluebird 在 NodeJS 中的承诺,没有到那时

Bluebird promises in NodeJS, not getting to then

我正在尝试在 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);
        });

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

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

    var p = nano.db.listAsync(function(body) {
        ...

有些地方不对。

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

P.S。您确定不应该将任何函数参数传递给 nano.db.listAsync() 吗?