Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺和递延对象_Javascript_Jquery_Promise_Deferred - Fatal编程技术网

Javascript 承诺和递延对象

Javascript 承诺和递延对象,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我从这里的一个非常好的答案中得到了以下内容,将两个建议的方法缝合在一起,但我不知道如何使代码正常工作 var animals = ['mouse', 'newt', 'shrew', 'grasshopper', 'frog', 'hedgehog']; $('#s1text1').delay(dur).fadeOut(dur).promise() .then(function() { return $('#s1text2').fadeIn(dur).promise(); }) .th

我从这里的一个非常好的答案中得到了以下内容,将两个建议的方法缝合在一起,但我不知道如何使代码正常工作

var animals = ['mouse', 'newt', 'shrew', 'grasshopper', 'frog', 'hedgehog'];

$('#s1text1').delay(dur).fadeOut(dur).promise()
.then(function() {
    return $('#s1text2').fadeIn(dur).promise();
})
.then(function() {
    var p = new $.Deferred().resolve();
    return $.each(animals, function(i, animal) {
        p = p.then(function() {
            return $('.' + animal).fadeIn(defaultDur, function() {
                animateAnimalGroup(animal);
            }).promise();
        });
    })
    .then(function() {
        return $('#s1text2').fadeOut(dur).promise();
    })
    .then(function() {
        return $('#s1text3').fadeIn(dur).promise();
    })
    .then(function() {
        return $('#s1text4').fadeIn(dur).promise();
    });

如有任何帮助/建议,将不胜感激。关于这方面的一篇好的教程/文章也会非常有用,如果有人知道的话,我已经读了一些内容,但我正在努力想办法解决它。

你不想返回
$的结果。每个
,你都想返回你在循环中积累的
p
承诺。此外,它缺少结束括号:

.then(function() {
    var p = new $.Deferred().resolve();
    $.each(animals, function(i, animal) {
        p = p.then(function() {
            …
        });
    })
    return p;
})
.then(…)

Bigwigal,您可能对另一种方法感兴趣,该方法涉及
array.reduce()
,以构建
.then()
链,而无需显式循环或显式分配/重新分配生成的承诺

//Data
var animals = ['mouse', 'newt', 'shrew', 'grasshopper', 'frog', 'hedgehog'],
    fades1 = [
        {id:'s1text1', delay:dur, action:'fadeOut'},
        {id:'s1text2', delay:0, action:'fadeIn'}
    ],
    fades2 = [
        {id:'s1text2', delay:0, action:'fadeOut'},
        {id:'s1text3', delay:0, action:'fadeIn'},
        {id:'s1text4', delay:0, action:'fadeIn'}
    ];

//Phase 1 (initial fades)
fades1.reduce(function(promise, item) {
    return promise.then(function() {
        return $('#' + item.id).delay(item.delay)[item.action](dur).promise();
    });
}, $.when()).then(function() {
    //Phase 2 (animal fades)
    return animals.reduce(function(promise, animal) {
        return promise.then(function() {
            return $('.' + animal).fadeIn(defaultDur).promise().then(function() {
                return animateAnimalGroup(animal);//you probably want a return here but not necessarily, depending on the visual effect you want.
            });
        });
    }, $.when());
}).then(function() {
    //Phase 3 (final fades)
    return fades2.reduce(function(promise, item) {
        return promise.then(function() {
            return $('#' + item.id).delay(item.delay)[item.action](dur).promise();
        });
    }, $.when());
});
您现在拥有的是一个硬编码的通用三相动画模式,其细节是数据驱动的。要更改详细信息,只需修改数组、
animals
fades1
fades2

这种方法可能很有用,但在最终结果中不是很有用,而是在开发过程中,您可能会在满足之前改变十几次想法

您可以更进一步,使用一个数组和一个
.reduce()
来完成整个任务,但是数据结构和代码可能会变得非常笨拙


我同意
.reduce()
模式不是这个星球上最容易阅读的模式,但它非常值得学习(就像我最近做的那样)。

实际描述这个问题会非常有帮助。什么是不起作用的?它应该如何起作用?您在哪里关闭
中的
。然后
p=p。然后
?var p=new$.Deferred().resolve()有什么意义?为什么要创建一个延迟并立即解决它?为什么不创建一个延迟的文件,稍后再解决?或者更好的是,当您可以使用jQuery动画中的承诺时,为什么还要创建自己的承诺?@jfriend00以便获得一个空的已解决承诺,稍后用于排队操作。感谢您花时间解释这一点,我非常感谢。我可以肯定地看到这种方法的优点。我只是试着投票赞成,但不幸的是我没有代表。再次感谢,非常有用。大人物,StackOverflow中有一些不合理的地方。天知道你为什么需要代表才能投票。当你获得更多的分数后,你可以随时回来。