按顺序运行JavaScript承诺。一个接一个地结束

时间:2017-06-07 21:12:22

标签: javascript asynchronous promise synchronization

我正在尝试运行promises(在每个上调用一些API)。根据两个promise的结果,使用第三个函数来处理数据。此外,按顺序运行的功能可能会发生变化。所以我以一种动态的方式建立了承诺。

然而,承诺似乎是在没有前一个结束的情况下开始的。这是一个用于测试相同概念的简化模型。

var funcs = [
	() => {
    console.log('Task 1 Sart =', new Date());
  	sleeper(6000, 'Task 1  Resolved');
    console.log('Task 1  Return');
  },
  () => {
  console.log('Task 2  Sart=', new Date());
  	sleeper(5000, 'Task 2  Resolved');
    console.log('Task 2  Return');
  },
  () => {
  console.log('Task 3  Start=', new Date());
  console.log('Task 2  Return');
  }
];

function sleeper(m, msg) {
	return new Promise(function(resolve, reject) {
  	setTimeout(function() {
    resolve(console.log(msg, new Date()));
  	}, m);
	});
}

function runSequence(functionSequence) {
   return functionSequence.reduce((p, func) => {
       return p.then(func);
   }, Promise.resolve());
} 

var v = runSequence(funcs);

结果看起来像这样 VM128:51任务1 Sart = Wed Jun 07 2017 13:54:34 GMT-0700(PDT) VM128:53任务1返回 VM128:56任务2 Sart = Wed Jun 07 2017 13:54:34 GMT-0700(PDT) VM128:58任务2返回 VM128:61任务3开始= 2017年6月7日星期三13:54:34 GMT-0700(PDT) VM128:62任务2返回 VM238:69任务2已解决星期三2017年6月7日13:54:39 GMT-0700(PDT) VM238:69任务1已解决星期三2017年6月7日13:54:40 GMT-0700(PDT)

我认为我看不到第二个任务开始直到第一个任务结束。看起来他们都是按顺序开始的。我错过了什么或者完全误解了承诺是如何运作的。我试图实现的是完成第一个,然后开始

1 个答案:

答案 0 :(得分:-2)

根据评论。这是版本的作品。原始代码中缺少简单的返回



var funcs = [
	() => {
    console.log('Task 1 Sart =', new Date());
  	return sleeper(7000, 'Task 1  Resolved');    
  },
  () => {
  	console.log('Task 2  Sart=', new Date());
  	return sleeper(3000, 'Task 2  Resolved');
  },
  () => {
  console.log('Task 3  Start=', new Date());
  console.log('Task 3  Return');
  }
];

function sleeper(m, msg) {
	return new Promise(function(resolve, reject) {
  	setTimeout(function() {
    resolve(console.log(msg, new Date()));
  	}, m);
	});
}

function runSequence(functionSequence) {
   return functionSequence.reduce((p, func) => {     
     return p.then(func);
   }, Promise.resolve());
} 

runSequence(funcs);