而在ASYNC AWAIT内循环

时间:2018-03-07 15:07:53

标签: javascript node.js async-await

我有一些代码通过网络调用不断更新一系列对象,如下所示。我想知道这是不好的做法,是否有更好的方法。我不能使用Set Interval,因为MakeAsyncCall回复之间的时间是可变的,如果拨打电话的时间长于延迟,则可能导致泄密。我将使用此信息来更新UI。这会导致阻塞吗?你的想法是什么?如果您需要更多信息,请告诉我。

let group = [item1, item2, item3];

// Start Loop
readForever(group, 100);

// Function to Delay X ms
const delay = ms => {
    return new Promise((resolve, _) => {
        const timeout = setTimeout(() => {
            resolve();
        }, ms);
    });
};

// Function to continuously Make Calls
const readForever = async (group, ms) => {
    while(true) {
        // Make Async Call
        for (let item of group) {
            await MakeAsyncCall(item);
        }

        // Wait X ms Before Processing Continues
        await delay(ms);
    }
};

1 个答案:

答案 0 :(得分:3)

给定的代码不会导致任何UI阻塞。并且是持续更新UI的有效方法。

而不是循环,你可以这样写:

top

除了关于const readForever = async (group, ms) => { // Make Async Call for (let item of group) { await MakeAsyncCall(item); } // Wait X ms Before Processing Continues await delay(ms); if (true) { // not needed, but there you could define an end condition return readForever(group, ms); } }; 功能的评论:
您可以直接将delay传递给resolve,因为您不需要在任何地方取消超时,而不需要将结果setTimeout存储在变量中。

setTimeout