【问题标题】:Run JavaScript promises in order. One after the other ends [duplicate]按顺序运行 JavaScript 承诺。一个接一个地结束[重复]
【发布时间】:2017-11-09 09:49:08
【问题描述】:

我正在尝试兑现承诺(对每个承诺进行一些休息 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 = 2017 年 6 月 7 日星期三 13:54:34 GMT-0700 (PDT) VM128:53 任务 1 返回 VM128:56 任务 2 Sart= 2017 年 6 月 7 日星期三 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)

我假设在第一个任务结束之前我看不到第二个任务开始。看起来他们都是按顺序开始的。有什么我错过或完全误解了承诺的运作方式。我试图实现的是完成第一个,然后开始以下操作

【问题讨论】:

  • 没有Promisefuns数组中的函数返回其他值,即return sleeper(6000, 'Task 1 Resolved');
  • 好的。我明白你在指出什么。使用返回它会按顺序做一些事情
  • “问题不在于返回值的位置。” 是的。 return 来自函数的Promise,否则无法在执行异步过程的匿名函数调用中确定任务已完成。你很接近,虽然sleeper() 调用,你已经返回一个Promise,不是从匿名函数调用返回的。另见stackoverflow.com/questions/44380582/…?
  • @amaksr 库不是满足要求的必要条件。只有return,并且可能需要一个链接的.then(),如果第二个console.log()调用预计在Promisesleeper()调用返回后被调用,如链接的jsfiddle所示。

标签: javascript asynchronous promise synchronization


【解决方案1】:

基于 cmets。这是版本的作品。原始代码中缺少一个简单的返回

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);

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多