jQuery转换Promise级联

Advcha

我有一个关于jQuery Promise级联的问题,我想简化一下。我有一个正在工作的级联函数(func1)。我在执行下一个功能之前将超时设置为2秒。我想复制并将其转换为数组归约形式(func2),但它不能像func1一样工作(超时时间不一样)。这是代码:

var Makes=[1,2,3,5,8];
$(document).ready(function(){
    //func1(); //WORKS
    func2();   //NOT WORKS LIKE func1

});

function func1(){
    timeout().then(function(){
       console.log("1");
       return timeout();
    }).then(function(){
       console.log("2");
       return timeout();
    }).then(function(){
       console.log("3");
       return timeout();
    }).then(function(){
       console.log("4");
       return timeout();
    }).then(function(){
       console.log("5");
       return timeout();
    });
}

function func2(){
    /*Makes.reduce(function(Models,Idx){
        return timeout().then(function(){
            console.log(Idx);
            return timeout();
            //return $.when(timeout());
        });
    },0);*/
    Makes.reduce(function(Models,Idx){
        return Models.then(function(){
            return timeout().then(function(){
                console.log(Idx);
                return timeout();
                //return $.when(timeout());
            });
        });
    },0);
}

function timeout(){
    var d = $.Deferred();
    setTimeout(function(){ 
        console.log("wait for 2 sec!");
        d.resolve(); 
    },2000);
    return d.promise();
}
亭子

你不应该返回timeout().thenreduce回调,但建立在你从以前的迭代有承诺:Models.then并且您应该给出一个初始承诺,即立即解决($.when()):

function func2(){
    Makes.reduce(function(Models, Idx) {
        return Models.then(function () {
            return timeout().then(function () {
                console.log(Idx);
            });
        });
    }, $.when()); // resolved starter promise
}

var Makes=[1,2,3,5,8];
$(document).ready(function(){
    func2(); 
});

function func2(){
    Makes.reduce(function(Models, Idx) {
        return Models.then(function () {
            return timeout().then(function () {
                console.log(Idx);
            });
        });
    }, $.when());
}

function timeout(){
    var d = $.Deferred();
    setTimeout(function(){ 
        console.log("wait for 2 sec!");
        d.resolve(); 
    },2000);
    return d.promise();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

另外,您可以使用一种“递归”函数来实现异步循环:

function func2(){
    (function repeat(Idx) {
        if (Idx >= Makes.length) return;
        timeout().then(function () {
            console.log(Makes[Idx]);
            repeat(Idx+1);
        });
    }(0));
}

var Makes=[1,2,3,5,8];
$(document).ready(function(){
    func2(); 
});

function func2(){
    (function repeat(Idx) {
        if (Idx >= Makes.length) return;
        timeout().then(function () {
            console.log(Makes[Idx]);
            repeat(Idx+1);
        });
    }(0));
}

function timeout(){
    var d = $.Deferred();
    setTimeout(function(){ 
        console.log("wait for 2 sec!");
        d.resolve(); 
    },2000);
    return d.promise();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

级联的Promise中缺少对象变量

来自分类Dev

jQuery Promise(Promise of Promise)

来自分类Dev

如何将Angular Promise转换为jQuery延迟对象

来自分类Dev

jQuery级联类-排除一个

来自分类Dev

Django / jQuery级联管理中的选择框

来自分类Dev

jQuery,使用.queue()级联CSS toggleClass()

来自分类Dev

jQuery 事件侦听器粘住/级联?

来自分类Dev

选择级联的jQuery选择不起作用

来自分类Dev

将Char值转换为货币以获取级联变量

来自分类Dev

Javascript:将 JSON 数组转换为级联 JSON

来自分类Javascript

如何将jQuery Deferred对象转换为ES6 Promise

来自分类Dev

从 jQuery ajax 函数的 promise 语法到 try/catch/finally 和 async/await 的转换失败?

来自分类Dev

jQuery ajax beforeSend遮蔽了$ .ajaxSetup`之一,如何级联它?

来自分类Dev

Rails jQuery级联下拉菜单重新加载

来自分类Dev

jQuery的链接和级联,然后是什么时候

来自分类Dev

jQuery级联与PHP和催化剂的下拉列表

来自分类Dev

使用对象数组填充并使用jQuery过滤级联下拉列表

来自分类Dev

Laravel 4 Jquery Ajax级联下拉菜单

来自分类Dev

将回调转换为Promise

来自分类Dev

Angular 2 转换为 Promise

来自分类Dev

AngularJS-$ q的Promise没有正确地级联到控制器

来自分类Dev

jquery promise and typescript

来自分类Dev

jQuery Promise的延迟

来自分类Dev

如何返回JQuery Promise

来自分类Dev

嵌套异步jQuery Promise

来自分类Dev

jQuery Promise回调

来自分类Dev

Javascript Promise与jQuery Deferred

来自分类Dev

jQuery的promise()和ClojureScript

来自分类Dev

JavaScript / jQuery Promise链接