制作异步功能的当今标准是什么?
我不是要在这里问基于选项的问题,而是要问2018年使用了什么,以及对将来的可伸缩性有何好处。
样式1:
const client = new SteamUser();
exports.setup = callback => {
client.on('webSession', async (sessionID, cookies) => {
offers.setup(client, cookies, callback);
});
client.on('error', err => {
callback(error)
});
};
样式2:
const client = new SteamUser();
exports.setup = async () => {
return new Promise(function(resolve, reject){
client.on('webSession', async (sessionID, cookies) => {
resolve(await offers.setup(client, cookies));
});
client.on('error', err => {
reject(error)
});
});
};
两者通过以下方式调用了另一个文件:
try{
await module.setup();
} catch(err){
console.log(err);
}
答案 0 :(得分:4)
承诺可以帮助您获得更具可读性和可维护性的代码。与回调相比,使用诺言所涉及的嵌套更少。
下面的代码使用回调:
someMethod = (arg) => {
getSomething1(arg, res1 => {
getSomething2(res1, res2 => {
getSomething3(res2, res3 => {
/* Do something here */
});
});
})
}
上面的代码中嵌套太多:回调内部的回调...(回调地狱)。您拥有的回调越多,阅读起来就越困难。
通过使用Promise,它将变为:
var someMethod = (arg) => {
getSomething1(arg).then(res1 => {
return getSomething2(res1);
}).then(res2 => {
return getSomething3(res2);
}).then(res3 => {
/* Do something here */
});
}
现在它更易读了,因为promise允许您垂直链接事物。
可以通过使用异步等待来进一步增强它:
someMethod() = async (arg) => {
var res1 = await getSomething1(arg);
var res2 = await getSomething2(res1);
var res3 = await getSomething3(res2);
/* Do something here */
}
现在看起来像是一个同步代码:易于阅读和维护。
答案 1 :(得分:-2)
我认为我们应该明确尝试使用try / catch方法。 Pouchdb文档很好地概述了如何以三种可能的不同方式来实现其功能。
回调
db.allDocs({
include_docs: true,
attachments: true
}, function(err, response) {
if (err) { return console.log(err); }
// handle result
});
承诺
db.allDocs({
include_docs: true,
attachments: true
}).then(function (result) {
// handle result
}).catch(function (err) {
console.log(err);
});
异步尝试/捕获
try {
var result = await db.allDocs({
include_docs: true,
attachments: true
});
} catch (err) {
console.log(err);
}