javascript - 使用 Promise 链接多个异步函数
问题描述
在这段代码中:
new Promise((resolve, reject) => {
DB.get(params, function(err, data) {
if (err) reject(err)
else resolve(data.Item)
})
})
.then((data) => {
let params = { Name: 'DEMO' }
CWevents.putRule(params, function(err, data) {
if (err) console.log("Error", err)
else console.log("Success")
})
})
.then(() => {
let params = { Rule: 'DEMO' }
CWevents.putTargets(params, function(err, data) {
if (err) console.log("Error", err)
else console.log("Success", data)
})
})
这里的DB.get
函数有一个回调,但是将多个回调放在一起看起来很糟糕,所以我决定使用 Promise。我创建了一个新的 Promise,里面是一个异步函数。在它完成运行后,它会根据需要解决并且第一个.then
开始工作。然后在第一个内部.then
我有另一个异步函数,它的工作原理与第一个非常相似。
resolve/reject
但这次没有跑了。所以第三个.then
在第二个内部的函数.then
完成之前运行。如何让第三个.then
等到第二个完成运行?那么函数1完成运行,然后函数2,然后3?
解决方案
您可以将调用包装在CWEvents.putRule
Promise 中。然后你可以从CWEvents.putRule
. 这可以通过一个then
或error
您的代码应如下所示
new Promise((resolve, reject) => {
DB.get(params, function(err, data) {
if (err) reject(err);
else resolve(data.Item);
});
})
.then(data => { // data not needed as you are not using it in the remaining code
let params = { Name: "DEMO" };
return new Promise((resolve, reject) => {
CWevents.putRule(params, function(err, data) {
if (err) {
console.log("Error", err);
reject(err)
} else {
console.log("Success");
resolve() // resolve(data) if you want to pass the data from CWEvents.putRule
}
});
});
})
.then(() => {
let params = { Rule: "DEMO" };
CWevents.putTargets(params, function(err, data) {
if (err) console.log("Error", err);
else console.log("Success", data);
});
});
您可以使用更具可读性的方式做同样的事情async await
async function process() {
try {
var data = new Promise((resolve, reject) => {
DB.get("params", function(err, data) {
if (err) reject(err);
else resolve(data.Item);
});
}); // this will return a promise to the variable data
var response = (function processData(data) {
let params = { Name: "DEMO" };
return new Promise((resolve, reject) => {
CWevents.putRule(params, function(err, data) {
if (err) {
console.log("Error", err);
reject(err);
} else {
console.log("Success " + data.Item);
resolve(data);
}
});
});
})(await data);
/* by using the await keyword , we can wait for the promise to be complete before moving on to the next step
of execution.
*/
/*
* waiting on the response promise to complete
*/
if (await response) {
let params = { Rule: "DEMO" };
CWevents.putTargets(params, function(err, data) {
if (err) console.log("Error", err);
else console.log("Success", data);
});
}
} catch (e) {
console.log("Error occured during operation " + e);
}
}
process();
您可以在 MDN 上找到更多详细信息async await
推荐阅读
- windows - 如何通过 USB 最大化数据传输速度(配置为虚拟 COM 端口)
- angularjs - 带有 `terminal:true` 的 AngularJS1 指令将禁用表达式的呈现,为什么?
- python - 打印非ASCII字符
- javascript - 传递给功能组件的道具会自动更改吗?
- database - mongodump --oplog 在“将捕获的 oplog 写入”时冻结
- laravel - Laravel - 检查值是否等于集合中的任何记录
- c# - 检查类是否是特定泛型的子类
- angular - Angular Material mat-selection-list 在重新加载时抛出 ExpressionChangedAfterItHasBeenCheckedError
- c# - 为什么隐式运算符必须是静态的?
- graphql - 如何在 Sangria 中使用 graphql 查询过滤列表响应