2016-04-15 90 views
0

针说我做错了什么。我需要一些帮助来搞清楚它是什么。Javascript承诺:然后()的不同步

考虑下面的代码(我的问题的简化版本):

function testTimer(time, msg,resolve){ 
console.log(arguments.callee.name); 
window.setTimeout(
       function() { 
        console.log("MSG:", msg); 
        if(resolve !== undefined) 
         resolve(1); 
       }, time * 1000); 
} 

new Promise(function(resolve, reject) { 
    testTimer(1, 'ONE', resolve); 
}).then(function(resolved){testTimer(9, 'TWO');}, function(rejected){alert("Rejected!", reject)}) 
.then(function(resolved){testTimer(1, 'THREE'); }, function(rejected){alert("Rejected!", reject)}); 

预期的输出是:

ONE 
TWO 
THREE 

相反由于第一然后要求9秒执行和第二然后需要1秒执行我得到:

ONE 
THREE 
TWO 

问题很简单:如何我可以得到当时的等待彼此吗?

谢谢!

回答

0

你需要以返回超时火灾后只能解决一个承诺:

function testTimer(time, msg,resolve) { 
    console.log(arguments.callee.name); 
    window.setTimeout(function() { 
     console.log("MSG:", msg); 
     if(resolve !== undefined) { 
      resolve(1); 
     } 
    }, time * 1000); 
} 

new Promise(function(resolve, reject) { 
     testTimer(1, 'ONE', resolve); 
    }).then(
     function(resolved){ 
      // here we return a promise - that is resolved by testTimer 
      // function. Notice that I'm passing a resolve function into it 
      return new Promise(function(resolve) { 
       testTimer(9, 'TWO', resolve); 
      }); 
     }, 
     function(rejected){ 
      alert("Rejected!", reject) 
     } 
    ) 
    .then(
     function(resolved){testTimer(1, 'THREE'); }, 
     function(rejected){alert("Rejected!", reject)} 
    ); 

它是如何工作的:testTimer功能为你定义了它 - 接受一个回调,因为这是成为第三个参数定时器启动后调用。我们用这个来解决我们在第二步中设定的嵌套承诺。所以第三步只有在第二步解决后才会发生,这发生在计时器中,所以订单保持如预期的那样。