如何从方法中返回promise

时间:2017-12-04 16:23:23

标签: javascript node.js knex.js

我正在使用knex,一个返回PostgreSQL承诺的库。我希望像pg库一样使用它。我的问题是我没有看到一种方法从类似于pg的方法返回一个promise,如下所示

var newObj = {

    getAllRows: function(callback) {
        return pg.query("select * from table",callback);
    },
};

在调用newObj.getAllRows时返回包含所有数据的所有行。

我为knex试过了同样的东西,但它没有返回......

var knexObj = {

    getAllRows: function(callback) {
        return knex('table').select("*")
               .then((data) {
                     return data;
             }
    },

3 个答案:

答案 0 :(得分:0)

这是一个有效的例子。您返回promise。 MDN在Using promises中解释得最好。

var getJSON = function(url) {
    return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open('get', url, true);
        xhr.onload = function() {
            var status = xhr.status;
            if (status == 200) {
                resolve(JSON.parse(xhr.response));
            }
            else {
                reject(status);
            }
        };
        xhr.send();
    });
};

答案 1 :(得分:0)

这里有不同的选择。考虑承诺文件的考生:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise

我建议将回调附加到返回的promise的then队列中,如下所示:



var knexObj = {

    getAllRows: function() {
        return Promise.resolve('MY DATA!')// stub for: knex('table').select("*") ....
    },
}

knexObj.getAllRows().then((data)=>{ // your callback!
  console.log("got the data:", data);
})




这样做的好处是,您可以将then语句链接在一起,并且不必反复传递回调。

此外,您可以捕获其中一个链部件中引发的所有错误,并尝试通过返回另一个承诺来解决它们。



var knexObj = {

    getAllRows: function() {
        return Promise.reject('ERROR')// stub for: knex('table').select("*") ....
    },
}

knexObj.getAllRows()
  .catch(()=>{
    console.log("something went wrong but I can resolve this!");
    return Promise.resolve('Default Data!')
  })
  .then((data)=>{ // your callback!
    console.log('part result:', data);
    return Promise.resolve(data.split(' '))
  })
  .then((splitData)=>{
    for(let data of splitData){
      console.log('final data part:', data);
    }
  })
  .catch(()=>{
    console.log("something went wrong and there is nothing I can do about it!");
  })




答案 2 :(得分:0)

/**
 * Returns the recommended memory cache size for the device it is run on in bytes.
 */
public int getMemoryCacheSize() {
    return memoryCacheSize;
}

/**
 * Returns the recommended bitmap pool size for the device it is run on in bytes.
 */
public int getBitmapPoolSize() {
    return bitmapPoolSize;
}