【问题标题】:Calling a Promise Method from another Promise从另一个 Promise 调用一个 Promise 方法
【发布时间】:2021-06-28 12:00:25
【问题描述】:

希望你们每个人都做得很好。我遇到了一些问题。任何帮助将不胜感激。

我正在使用 ldapJS,我想从 LDAPJS 的 searchEntry 方法中调用另一个承诺。当我编写与下面相同的代码时。它会引发错误

exports.getADUsers = async (reqst, resp, next) => {
    let flag = false;
    var finalList = [];
    let adConnStatus = await ConnectAD()
        .then().catch((errConnStatus) => {
            console.log("Error in connection with Active directory " + errConnStatus);
        });

    if (adConnStatus.status == 0) {
        let client = adConnStatus.client;
        const opts = {
            filter: '(ObjectClass=*)',
            scope: 'sub',
            attributes: ['cn', 'sid', "objectSid"]
        };
        client.search('dc=domain,dc=com', opts, (err, res) => {
            if (err) {
                console.log("Error: " + err);
            } else {
                res.on('searchEntry', (entry) => {
                    finalList = await searchEntry(entry);
                });
                res.on('searchReference', (referral) => {
                    console.log('referral: ' + referral.uris.join());
                });
                res.on('error', (err) => {
                    console.error('error: ' + err.message);
                });
                res.on('end', (result) => {
                    resp.send(finalList);
                    console.log(result);
                });
            }
        });
    }
}

错误:

finalList = await searchEntry(entry);
            ^^^^^

SyntaxError: await is only valid in async function

请帮忙!如何从一个承诺中调用另一个承诺。虽然该方法是异步的,但为什么会显示此消息?我做错了什么?

编辑

按照@Punth 的建议添加关键字async 后。还修改了一些代码。我的新代码如下。

exports.getADUsers = async (reqst, resp, next) => {
    let adConnStatus = await ConnectAD()
        .then().catch((errConnStatus) => {
            console.log("Error in connection with Active directory " + errConnStatus);
        });

    if (adConnStatus.status == 0) {
        var adUsersList = [];
        let client = adConnStatus.client;
        const opts = {
            filter: '(ObjectClass=*)',
            scope: 'sub',
            attributes: ['cn', 'sid', "objectSid"]
        };
        client.search('dc=domain,dc=com', opts, (err, res) => {
            if (err) {
                console.log("Error: " + err);
            } else {
                res.on('searchEntry', async (entry) => {
                    var raw = entry.raw;
                    if (raw.objectSid != "undefined" && raw.objectSid != null && entry.object.cn != null && entry.object.cn != "undefined") {
                        let userData = {
                            "Name": entry.object.cn,
                            "SSID": sidBufferToString(raw.objectSid)
                        }
                        var lmn = await ConnectAndGetUsersList(userData.SSID);
                        userData["XYZ"] = lmn.xyz;
                        userData["ABC"] = lmn.abc;
                        adUsersList.push(userData);
                    }
                });
                res.on('searchReference', (referral) => {
                    console.log('referral: ' + referral.uris.join());
                });
                res.on('error',  (err) => {
                    console.error('error: ' + err.message);
                });
                res.on('end', (result) => {
                    console.log(result);
                    resp.send(adUsersList);
                });
            }
        });
    }
}

通过运行上面的代码,它不会向我显示任何内容。 res.on('end' ....)res.on("searchEntry"....) 之前被调用,因此adUsersList 的数组为空。

现在我的问题是如何resp.send最终的arraylist???

【问题讨论】:

  • (err, res) => {…}(entry) => { … } 不是 async 方法
  • 您希望从响应流中获得多少 searchEntry 事件?
  • 是的,您的 client.search 不是异步方法,因此您不能在内部使用 await。就做searchEntry(entry).then(...)
  • @Bergi 搜索条目事件可能从 100 到数百万不等
  • @Bergi 请您帮忙解决这个问题,等待仅在异步方法中有效。哦!等等,让我更新我的问题,我忘了添加搜索条目方法部分

标签: javascript node.js ldapjs


【解决方案1】:

如下更新这一行,以在回调中使用async/await 语法调用承诺,您需要使其异步

 res.on('searchEntry', async (entry) => {
   finalList = await searchEntry(entry);
 });

【讨论】:

  • 请添加评论,解释为什么答案被否决。这对我和社区都有用。我愿意了解和学习缺失的部分。
  • @PunithK 看看finalList 变量是如何使用的,你会发现这段代码实际上是行不通的
  • @Bergi 是的,你是对的,我没有查看整个代码,我试图解决他指出的错误。我读了你的 cmets,我同意。
  • @PunithK 谢谢!这解决了我的问题,但在searchEntry 之前调用了另一个问题res.on('end', () => { // some code})。我尝试输入async,但没有成功!你知道如何解决它吗?
  • @AsadMehmood 您必须对事件循环在 NodeJS 中的工作方式有一个清晰的思维模型。当您仍在对SearchEntry 执行异步操作时,事件end 被同步触发。一种可能的解决方案是在您解决完searchEntry 中的所有承诺后广播end 事件。否则,您可以按照上面提供的解决方案 @Bergi 使用 Promise.all()
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多