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实现分成单独的函数,并让它们返回一个承诺。这样,您的代码将更加干净。