如何处理node.js的承诺

时间:2017-11-07 15:00:56

标签: node.js promise

我用节点js开始冒险。我被promis和使用模块的promis所压倒。

有人可以一步一步地向我解释代码中发生了什么以及如何使用promise进一步传递数据? 你知道任何好的教程或文章描述和概述吗?

promis是否有不同的语法,具体取决于模块?

我使用bluebird和我的代码从API检索数据如下:

const Promise = require('bluebird');
const rp = require('request-promise');

let hello = "Hello";
console.log(hello);

const options = {  
    url: 'https://bitbay.net/API/Public/BTCUSD/orderbook.json',
    method: 'GET',
    headers: {
    'Accept': 'application/json',
    'Accept-Charset': 'utf-8',
    },
    json: true
};

let promise = Promise.resolve();

promise = promise.then(() => {
    let p1 = rp(options);
    let p2 = rp(options);
    let p3 = rp(options);

    return Promise.all([p1,p2,p3]);
});
promise = promise.then(([p1, p2, p3]) => {
    console.log(response);

    return 'works';
});
promise = promise.then((x) => {
    console.log(x);
})

现在我想使用数据库,所以我写了这样的东西:

const Promise = require('bluebird');
const mysqlssh = require('mysql-ssh');

mysqlssh.connect(
    {
        host: '****',
        user: '****',
        password: '*****!'
    },
    {
        host: '127.0.0.1',
        user: '****',
        password: '****',
        database: '****'
    }
)
.then(client => {
     client.query(`SELECT $ FROM users`, function (err, results, 
fields) {
     if (err) throw err;
     console.log(results);
     mysqlssh.close()
})
client.query(query, function (err, results, fields) {
    if (err) throw err;
    console.log(results);
    console.log(results[0]['BTC_turnover']);
    mysqlssh.close()
    })
})
.catch(err => {
    console.log(err)
})

我不知道如何加入它。首先下载数据,然后询问基础,然后再进一步。

1 个答案:

答案 0 :(得分:1)

所以,首先,Promises是相当简单的小对象,它们取代了回调的需要。当异步操作完成时,如果一切正常,则将结果传递给then方法,如果出现问题,则将结果传递给catch方法。

// This function using a callback is equivalent to 
// the following function which uses a Promise
asyncFn((err, result) => {
    if (err) throw err
    console.log(result)
})

asyncFn()
  .then(result => { console.log(result) })
  .catch(err => { throw err })

当你连续有许多异步函数时,Promise特别好。使用回调,您必须嵌套它们,这将非常难以阅读。使用Promises,您可以在不嵌套的情况下继续添加then方法。

接下来,有一些Promise库,它们在某些功能上有所不同,但它们的核心行为是相同的。你应该可以互换使用它们。另外,请记住Promise只是对象。在您的示例代码中,您正在使用mysqlssh.connect返回的Promise,它是 native Promise。您碰巧在代码中导入bluebird的事实不会改变返回的对象。

好的,最后值得注意的是,虽然mysqlssh.connect会返回一个Promise,但您获得的clientmysql2连接。这是一个完全不同的库,使用Promises。这就是您需要将回调传递到client.query的原因。你可以很好地混合Promise和callbacks,但正常规则适用于你的回调:如果你想在调用第一个结果之前等待第一个结果,必须嵌套它们

现在,你正在独立解雇他们。一个人的结果无法与另一个人的结果进行交互,更糟糕的是,无论哪个人首先完成,都会在慢速完成之前关闭数据库连接!重写你的嵌套查询:

client.query(`SELECT $ FROM users`, function (err, userResults, userFields) {
    if (err) throw err;
    console.log(useResults);

    client.query(query, function (err, results, fields) {
        if (err) throw err;
        console.log(results);
        console.log(results[0]['BTC_turnover']);

        // Insert any joining of userResults, userFields, results, and fields here

        mysqlssh.close()
    })
})