gpt4 book ai didi

javascript - 使用 Promise 链接多个异步函数

转载 作者:行者123 更新时间:2023-12-02 22:43:27 26 4
gpt4 key购买 nike

在此代码中:

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调用promise的resolve或reject。这可以通过 thenerror

捕获

你的代码应该是这样的

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 wait以更具可读性的方式执行相同的操作

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();

您可以找到有关async wait的更多详细信息 on MDN

关于javascript - 使用 Promise 链接多个异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58508877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com