Javascript 使用承诺链的多异步函数
在此代码中:Javascript 使用承诺链的多异步函数,javascript,node.js,asynchronous,promise,Javascript,Node.js,Asynchronous,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(
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
函数有一个回调函数,但是如果将多个回调函数放在一起,看起来会很糟糕,所以我决定使用Promissions。我创建了一个新的promise,其中包含一个异步函数。完成运行后,它将解析,第一个。然后根据需要开始工作。然后在第一个中,我有另一个异步函数,它的工作原理与第一个非常相似
但是这次没有要运行的resolve/reject
。因此第三个。然后在第二个中的函数运行之前运行。然后完成。如何使第三个。然后
等待第二个完成运行?所以函数1运行完毕,然后是函数2,然后是函数3?我找到了一个解决方案。在中,然后可以创建一个新的承诺并将其返回到下一个。然后像这样
new Promise((resolve, reject) => {
setTimeout(() => {resolve(1)}, 1000)
})
.then((message) => {
console.log(message)
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(2)}, 5000)
})
})
.then((message) => {
console.log(message)
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(3)}, 1000)
})
})
这将同步地将它们链接在一起,因此输出将是1、2、然后是3。如果没有构造,它将同时输出1和3,然后输出2。您可以将CWEvents.putRule
调用封装在承诺中。然后,您可以从CWEvents.putRule
调用承诺的resolve或reject。这可以通过然后
或错误
您的代码应该如下所示
new Promise((resolve, reject) => {
setTimeout(() => {resolve(1)}, 1000)
})
.then((message) => {
console.log(message)
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(2)}, 5000)
})
})
.then((message) => {
console.log(message)
return new Promise((resolve, reject) => {
setTimeout(() => {resolve(3)}, 1000)
})
})
新承诺((解决、拒绝)=>{
DB.get(参数,函数(错误,数据){
如果(错误)拒绝(错误);
else解析(数据项);
});
})
.then(data=>{//data不需要,因为您没有在剩余代码中使用它
设params={Name:“DEMO”};
返回新承诺((解决、拒绝)=>{
putRule(参数,函数(错误,数据){
如果(错误){
日志(“错误”,err);
拒绝(错误)
}否则{
控制台日志(“成功”);
resolve()//如果要从CWEvents.putRule传递数据,请解析(数据)
}
});
});
})
.然后(()=>{
设params={Rule:“DEMO”};
putTargets(参数、函数(错误、数据){
if(err)console.log(“Error”,err);
else console.log(“成功”,数据);
});
});
使用asyncwait
异步函数进程(){
试一试{
var数据=新承诺((解决、拒绝)=>{
DB.get(“参数”,函数(错误,数据){
如果(错误)拒绝(错误);
else解析(数据项);
});
});//这将返回对变量数据的承诺
var响应=(函数processData(数据){
设params={Name:“DEMO”};
返回新承诺((解决、拒绝)=>{
putRule(参数,函数(错误,数据){
如果(错误){
日志(“错误”,err);
拒绝(错误);
}否则{
console.log(“成功”+数据项);
解析(数据);
}
});
});
})(等待数据);
/*通过使用wait关键字,我们可以等待承诺完成后再进入下一步
执行的方式。
*/
/*
*等待响应承诺完成
*/
如果(等待响应){
设params={Rule:“DEMO”};
putTargets(参数、函数(错误、数据){
if(err)console.log(“Error”,err);
else console.log(“成功”,数据);
});
}
}捕获(e){
console.log(“操作时出错”+e);
}
}
过程();
您可以找到有关async wait
的更多详细信息。是否可以添加resolve()
和reject()
而不是控制台。log()
s?不,resolve仅为第一个Promise()函数定义。.then没有resolve()函数。要链接,所有异步操作都需要返回承诺。然后,您可以从.Then()
处理程序返回承诺,它们将正确排序,错误将正常工作。步骤1,演示所有异步操作util.promisify()
是您的朋友。或者,现在大多数数据库都有一个内置的promise接口,您可以使用它来代替回调接口。您应该将DB和CWevents实现分成单独的函数,并让它们返回一个承诺。这样,您的代码将更加干净。