2016-11-26 107 views
0

解决我尽量按顺序执行承诺,但出问题的时间...延迟承诺链

当我执行下面的代码,我得到了瞬间的五个回答“我是XXX,我得到YY” 2秒钟后,我收到了“成功”消息。

我想要的是先得到消息“我是XXX,我得到YY”,间隔2秒,然后成功。

有什么想法?

"use strict"; 
Promise.resolve() 
    .then(doStuff) 
    .then(function() { 
    console.log("Success"); 
}) 

function doStuff() { 
    let item = [1, 2, 3, 4, 5, 6]; 
    // Construction du tableau de promises 
    let array = item.map(i => { 
    let pro = new Promise((resolve, reject) => { 
     setTimeout(() => { 
     resolve("Item " + i); 
     }, 2000); 
     }); 
    pro.custom = i; 
    return pro; 
    }); 

    let pro = array.reduce((p, item) => { 
     return p.then((val) => { 
     console.log("I'm " + item.custom + " and I get " + val); 
     return Date.now(); 
     }); 
    }, Promise.resolve()); 

    return pro; 
} 

(和我的英文不好对不起)。

+0

非常难以阅读不一致缩进的代码,其中具有多个级别。 – jfriend00

+0

好的,我只是发现了StackOverflow在线编辑器。我试图在未来做更好的缩进(我保证)... – sgibout

回答

0

目前,所有的延迟,同时,这也是为什么他们都完成在乱舞一次,并开始为什么有一个延迟2秒betwewn doStuff和Success消息

如果更改doStuff为如下所示,输出应该是相同的,但是在阵列中的项目之间具有2秒的延迟

function doStuff() { 
    let item = [1, 2, 3, 4, 5, 6]; 
    let delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)); 
    return item.reduce((p, val, i) => 
    p 
    .then(() => delay(2000)) 
    .then(() => { 
     console.log("I'm " + i + " and I get " + val); 
     return Date.now(); 
    }), Promise.resolve()); 
}