我用节点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)
})
我不知道如何加入它。首先下载数据,然后询问基础,然后再进一步。
答案 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,但您获得的client
是mysql2
连接。这是一个完全不同的库,不使用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()
})
})