0

我在这里的问题可能听起来很少重复。但是我在stackoverflow上没有找到任何可以解决我的问题的答案。

我正在从我的一个功能中返回一个承诺。从数据库中获取一些数据后,承诺将得到解决。如果 db 表中没有数据,将被拒绝。此外,在解决承诺之前,我必须对获取的数据进行一些处理,这就是我使用回调的原因。

我的代码片段

return new Promise((resolve, reject) => {


            ResourceModel.getById(resource_ID).then((data) => {
                if (data.length > 0) {
                    console.log(data);
                    resolve(data);
                    console.log("Resolve Function Called");
                } else {
                    console.log("No data available");
                    reject(new Error("No data available"));
                }
            });
        });

ResourceModel.getById()

static getById(id) {
        const _transaction = cds.transaction();

        return _transaction.run(SELECT.from(Resource).where({ ID: id }));
    }

cds.transaction()是 SAP 提供的 cds 框架方法之一。

我期望它做的是在成功获取所有记录后,它应该调用提供的回调,我在其中编写了处理逻辑并resolve()在处理完成后调用。

我在回调中接收数据,能够打印Data available并且接收到的数据对象甚至Promise Resolved在控制台上结束。但令人惊讶的是,承诺没有得到解决

我可以说“承诺没有得到解决”,因为这个返回的承诺将由Promise.all()框架收集(如官方文档中所述 - https://cap.cloud.sap/docs/node.js/api#service -before ) 并在解决后返回响应。但我没有得到任何回应(既没有成功也没有失败)。邮递员永远处于加载状态。

上面的例子与setTimeout()例子一起工作得很好。

我哪里错了?

4

2 回答 2

0

首先,添加.catch()以获取拒绝值。

function asyncOpr = () => { 
    return new Promise((resolve, reject) => {
        ResourceModel.getById(resource_ID).then((data) => {
                    if (data.length > 0) {
                        console.log(data);
                        resolve(data);
                        console.log("Resolve Function Called");
                    } else {
                        console.log("No data available");
                        reject(new Error("No data available"));
                    }
            }).catch(err => { /* handle error */ })
        });
  }

您可能无法获得解析值的原因是您如何使用此功能。正确的实现是:

function foo() {
  asyncOpr().then( val => console.log(val))
            .catch( err => console.log(err))
}

另外,请参阅使用async/await

于 2020-02-17T06:51:49.993 回答
0

我在进行 API 调用或从数据库中获取数据时遇到了这种类型的错误。通常,被调用资源或标头的类型不匹配的问题是返回类型错误。在 getById() 中有 console.log 并查看堆栈跟踪中发生了什么会很好。

于 2020-02-16T07:24:18.610 回答