当前位置: 首页 > 知识库问答 >
问题:

使用promise的链式多异步函数

全流觞
2023-03-14
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)
    })
})

共有1个答案

秦德海
2023-03-14

您可以将cwevents.putrule调用包装在promise中。然后,可以从CWevents.putrule调用promise的解析或拒绝。这可以通过然后错误捕获

您的代码应该如下所示

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

 类似资料:
  • 我正在研究promsies和async/await的用法。 我编写了以下代码,它执行以下操作: 它获取一些数据库数据(使用Knex.js), 处理该数据, 将处理的数据分配到指定的属性中 这3个步骤执行了多次(在下面的代码中,执行了两次),并且始终等待执行: 现在,我正在尝试编写与等效的promise链,这就是我想到的: 但这不太管用。发生的是,在第一个返回之后,中的结束了它的等待,这导致返回-并

  • 链式调用异步函数。 循环遍历包含异步事件的函数数组,每次异步事件完成后调用 next 。 const chainAsync = fns => { let curr = 0; const next = () => fns[curr++](next); next(); }; chainAsync([ next => { console.log('0 seconds');

  • 我有一个异步块: 我可以跟踪成功和失败的结果。但是,是否可以重试整个chain?然后继续重试,直到问题解决?

  • 我被要求创建一个名为的对象,它可以链接函数和。 例如: 在此场景中,它首先打印早餐,等待3秒钟,打印午餐,然后在3秒钟后打印晚餐。 我试过这样的东西,但没用。我错过了什么?

  • 我试图利用es7异步功能,即。 在这里,所有promise*函数都进行ajax调用,并返回或如果ajax响应满足传递的参数,我相信我不能连续使用3个等待,因此需要一种方法来等待所有这些调用以某种方式返回它们的值。

  • 问题内容: 我目前正在尝试诺言,并且有一个非常基本的问题! 在一个Promise链中,调用同步函数是否是错误的做法?例如: 还是应该将我的同步功能重构为也返回承诺? 问题答案: 在一个Promise链中,调用同步函数是否是错误的做法? 不,这根本不是一个坏习惯。这是许多预期和有用的实践之一。 您可以完全自由地(在处理程序中)调用promise链中的同步函数或异步函数,然后再返回新的promise。