1

我编写了以下代码来将提到的消息发布到 Slack。

const resultSlack = [];
const selectedItems2 = 'XX : TESTS';

const getUserid = (value) => {
    return new Promise(resolve => {
    for (let i = 0; i < value.length; i++) {
        let str = value[i].slice(5);
        let body = {
            app: XXX,
            query: '"'+ str +'"'
        };
        kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, resp => {
            resultSlack.push("<@" + resp.records[0].slackId.value + ">");
        });
    }
    resolve(resultSlack);
    });
};
getUserid(selectedItems2).then(results => {
    console.log(results);
    //There is an array
    //0: "<@XXXXXXXX>"
    //1: "<@YYYYYYYY>"
    //2: "<@ZZZZZZZZ>"
    //3: "<@SSSSSSSS>"
    const payload = { text: results + "send already" }; 
    //specify results in the payload, it will be ignored.
    console.log(payload); // text: "send already"
});

是否无法使用 then 方法访问作为参数传递的数组?如何在结果中使用数组中的值?请给我一些建议。

4

3 回答 3

3

您的代码不正确,因为它没有正确等待kintone.api()循环中的结果。

对你来说幸运的是,kintone.api()居然有可能兑现承诺!https://developer.kintone.io/hc/en-us/articles/212494388/

这意味着您可以async/await在循环中使用语法:

const getUserid = async (value) => {
    const resultSlack = [];
    for (let i = 0; i < value.length; i++) {
        let str = value[i].slice(5);
        let body = {
            app: XXX,
            query: '"'+ str +'"'
        };
        const resp = await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body);
        resultSlack.push("<@" + resp.records[0].slackId.value + ">");
    }
    return resultSlack;
};

(警告:该代码不会同时发出所有循环请求,如果您觉得需要它,这是可能的。它按所写的方式一次发出一个请求)

现在它被写成一个异步函数,你可以这样做:

getUserid(selectedItems2).then(results => ...
于 2020-10-09T09:28:00.800 回答
1

在解决承诺之前,您必须等待所有 API 调用的响应。

一个更好的方法是将 API 调用转换为 Promise 并解决它们,这是一个示例:

const getUserid = (value) => {
    const requests = [];
    for (let i = 0; i < value.length; i++) {
        let str = value[i].slice(5);
        requests.push({
            app: XXX,
            query: '"'+ str +'"'
        });
        
    }
    return Promise.all(requests.map((req) => new Promise(resolve => kintone.api(kintone.api.url('/k/v1/records', true), 'GET', req, resp => {
            resolve("<@" + resp.records[0].slackId.value + ">");
        })));
};
于 2020-10-09T09:32:08.890 回答
0
const getUserid = (value) => {
return new Promise(async resolve => {
for (let i = 0; i < value.length; i++) {
    let str = value[i].slice(5);
    let body = {
        app: XXX,
        query: '"'+ str +'"'
    };
    await kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body, resp => {
        resultSlack.push("<@" + resp.records[0].slackId.value + ">");
    });
}
resolve(resultSlack);
});
};

当您调用发出 http 请求的异步函数时,您需要使用await等待处理完成。

于 2020-10-09T09:32:39.607 回答