为什么我的诺言返回未定义?

烈火凤凰

背景

我正在尝试使一个函数延迟X毫秒执行异步函数。

出于演示目的,以下是异步函数,该函数带有一个URL:

/*
 *  This is a simulation of an async function. Be imaginative! 
 */
let asyncMock = function(url) {
    return new Promise(fulfil => {

        setTimeout(() => {
            fulfil({
                url,
                data: "banana"
            });
        }, 10000);

    });
};

目的

我的目标是要有一个函数,该函数将接受Xurl参数,asyncMock然后每隔X ms调用一次,直到不再有其他参数为止。

基本上,我希望每次调用都asyncMock用X ms分隔。

例如,假设我asyncMock连续打电话20次。通常,这20个呼叫将立即进行。我想要的是确保20个呼叫之间都存在Xms的延迟。

暂定

解决这个问题的想法是建立一个工厂,该工厂将返回一个承诺承诺将在X ms之后执行该功能。

let throttleFactory = function(args) {

    let {
        throttleMs
    } = args;

    let promise = Promise.resolve();

    let throttleAsync = function(url) {

        return promise.then(() => {

            setTimeout(anUrl => {
                return new Promise( fulfil => {
                    fulfil(asyncMock(anUrl));
                });
            }, throttleMs, url);
        });
    };

    return Object.freeze({
        throttleAsync
    });
};

理想情况下,我将在下面的示例中使用该工厂:

let throttleFuns = throttleFactory({
    throttleMs: 2000
});

console.log('running');

throttleFuns.throttleAsync('http://www.bananas.pt')
    .then(console.log)
    .catch(console.error);

throttleFuns.throttleAsync('http://www.fruits.es')
    .then(console.log)
    .catch(console.error);

throttleFuns.throttleAsync('http://www.veggies.com')
    .then(console.log)
    .catch(console.error);
// a ton of other calls in random places in code

问题

这里的问题是我的throttleAsync功能undefined立即输出3次。我相信这可能是因为我没有promise正确定义

如何修复此代码以使其正常工作?

TJ人群

因为throttleAsync返回调用的结果promise.then,并且then回调不返回任何内容。这使得通过then解决创造的承诺具有价值undefined

您可能打算让它返回您正在创建的新的Promise,但是直到setTimeout回调之前您都不会这样做您想事先做(但还有更多,请继续阅读):

let throttleAsync = function(url) {

    return promise.then(() => {
        return new Promise( fulfil => {
            setTimeout(anUrl => {
                fulfil(asyncMock(anUrl));
            }, throttleMs, url);
        });
    });
};

也没有理由setTimeout像这样传递URL ,因此:

let throttleAsync = function(url) {

    return promise.then(() => {
        return new Promise( fulfil => {
            setTimeout(() => {
                fulfil(asyncMock(url));
            }, throttleMs);
        });
    });
};

最初,我虽然promise没有必要,但是您已经澄清了,您想确保重复的呼叫由隔开throttleMs为此,我们将使用上面的方法,但要进行更新promise

let throttleAsync = function(url) {

    return promise = promise.then(() => {
    //     ^^^^^^^^^
        return new Promise( fulfil => {
            setTimeout(() => {
                fulfil(asyncMock(url));
            }, throttleMs);
        });
    });
};

这样,下一个呼叫asyncThrottle将一直等到前一个触发后再开始下一个。

现场示例:

const throttleMs = 1000;

const asyncMock = url => url;

let promise = Promise.resolve();

let throttleAsync = function(url) {

    return promise = promise.then(() => {
    //     ^^^^^^^^^
        return new Promise( fulfil => {
            setTimeout(() => {
                fulfil(asyncMock(url));
            }, throttleMs);
        });
    });
};

console.log('running');

throttleAsync('http://www.bananas.pt')
    .then(console.log)
    .catch(console.error);

throttleAsync('http://www.fruits.es')
    .then(console.log)
    .catch(console.error);

throttleAsync('http://www.veggies.com')
    .then(console.log)
    .catch(console.error);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在使用诺言时在类方法中未定义“ this”?

为什么我的对象返回未定义?

为什么innerHTML返回“未定义”?

为什么我的find方法返回未定义?

为什么我的函数未定义?

为什么我的get请求在我的图像文件树中返回未定义?

为什么response.chartAt(0)在我的AJAX调用中返回未定义?

为什么我的函数总是返回未定义的?

我不明白为什么我的for循环返回“未定义”

为什么我的变量在javascript中返回未定义?

为什么我的reducer返回未定义的React TypeScript

为什么我的async / await Postgres查询返回了未定义的信息?

为什么我的递归函数返回未定义?

为什么我的变量表数据返回未定义?

为什么尝试读取数据属性在我的网站中返回未定义?

为什么返回未定义状态?

为什么当我返回false时,_。map返回未定义?

为什么函数返回未定义?

为什么我的方法未定义?

为什么未定义我的方法?

为什么我的递归函数返回“未定义”?

为什么 .forEach 返回未定义?

为什么我的 express-session 变量在不同的路线上返回“未定义”?

为什么我的 axios 帖子在我的功能组件中返回未定义?

为什么我的嵌套承诺然后返回未定义?

为什么我的 nodejs 函数返回未定义?

为什么我的intersectionObserver 将我的querySelect 返回为未定义?

为什么我的函数返回“未定义”

为什么地图返回[未定义]?我该如何解决?