Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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_Es6 Promise - Fatal编程技术网

Javascript 编写返回承诺的函数

Javascript 编写返回承诺的函数,javascript,es6-promise,Javascript,Es6 Promise,我想把两个返回承诺的函数组合成一个返回承诺的函数 我真的很想为异步系统调用这样做,但为了简化事情,现在我正在使用围绕setTimeout的承诺。大多数系统调用可以以任何顺序发送和返回,但在少数情况下,创建第二个系统调用需要来自一个系统调用的数据 在所附的示例中,我希望以5秒、3秒、10秒的间隔发送警报。当我运行代码时,事情以错误的顺序运行 我注释掉了我能够运行两个用“.then”链接的调用的代码。注释掉的代码按需要工作。但我还没有弄明白如何将其放入一个返回承诺的函数中,并且仍然可以工作 我感兴趣

我想把两个返回承诺的函数组合成一个返回承诺的函数

我真的很想为异步系统调用这样做,但为了简化事情,现在我正在使用围绕setTimeout的承诺。大多数系统调用可以以任何顺序发送和返回,但在少数情况下,创建第二个系统调用需要来自一个系统调用的数据

在所附的示例中,我希望以5秒、3秒、10秒的间隔发送警报。当我运行代码时,事情以错误的顺序运行

我注释掉了我能够运行两个用“.then”链接的调用的代码。注释掉的代码按需要工作。但我还没有弄明白如何将其放入一个返回承诺的函数中,并且仍然可以工作

我感兴趣的是只使用普通JavaScript来实现这一点。在我理解了如何做到这一点之后,我将使用一个库来查看答案


记住函数是如何工作的(在任何编程语言中)。这:

与此相同:

const sleepPrintSleepPrint = (delay1, delay2) => {
  var x = sleepPrint(delay2);
  return sleepPrint(delay1)
  .then(x);
};
您所做的是同时调用这两个函数。我认为您打算在解析后调用第二个函数。因此,您需要这样做:

const sleepPrintSleepPrint = (delay1, delay2) => {
  return sleepPrint(delay1)
  .then(function(){return sleepPrint(delay2)});
};
或者,如果您更喜欢箭头函数语法:

const sleepPrintSleepPrint = (delay1, delay2) => {
  return sleepPrint(delay1)
  .then(() => sleepPrint(delay2));
};

记住函数是如何工作的(在任何编程语言中)。这:

与此相同:

const sleepPrintSleepPrint = (delay1, delay2) => {
  var x = sleepPrint(delay2);
  return sleepPrint(delay1)
  .then(x);
};
您所做的是同时调用这两个函数。我认为您打算在解析后调用第二个函数。因此,您需要这样做:

const sleepPrintSleepPrint = (delay1, delay2) => {
  return sleepPrint(delay1)
  .then(function(){return sleepPrint(delay2)});
};
或者,如果您更喜欢箭头函数语法:

const sleepPrintSleepPrint = (delay1, delay2) => {
  return sleepPrint(delay1)
  .then(() => sleepPrint(delay2));
};

@slebetman提供了正确的代码,并在较高级别上正确地解释了问题和修复。这是我对他的回答更详细的理解。这应该是对他的回答的评论,但太大了

JavaScript解释器对包含chained“.然后”s的代码进行两次遍历

第一关马上就来了,没有任何等待。解释器查看参数to.then,如果看到函数或表达式,则执行不同的操作。函数放在调用堆栈上,并与承诺关联。表达式被求值,如果完成值是一个函数,则该函数被放置在调用堆栈上,并与承诺关联

在第二个过程中,在解析承诺之后,将计算调用堆栈中的关联函数

在生产代码中,chained.then应始终遵循特定的模式。模式是“.then”的参数是一个返回第二个回调函数的函数。在第一个过程中,没有发生任何有趣的事情,执行第一个函数,返回值是第二个回调函数。第二个回调函数放在调用堆栈上,并与承诺关联。在第二个过程中,在解析了相关的承诺之后,执行第二个回调函数

但在这个例子中,我打破了这个模式,以学习和演示如何链接。然后我们开始工作

下面是一个不使用该模式的示例,它公开了双过程行为

正在讨论两个参数。然后是成功回调函数和失败回调函数。 如果省略了一个或两个参数,或这些参数都是非函数提供的,则将缺少处理程序,但不会生成任何错误

如果给“.then”一个函数,那么在第一个过程中,该函数被放在调用堆栈上,但没有其他事情发生,在第二个过程中,该函数被执行。 但是如果你给“.then”一个表达式,那么在第一步中,表达式被计算。如果完成值是一个函数,则将其放置在调用堆栈上,并在第二个过程中执行。如果完成值不是函数,则在第二个过程中,不会采取进一步的操作,也不会生成错误

第一遍(JavaScript解释器立即运行这些东西。)

  • 启动睡眠打印(firstDelay)。让它在后台运行

  • 立即转到下一个“.then”

  • 打印第一条消息。在调用堆栈上不放置任何内容

  • 立即转到下一个“.then”

  • 将函数()=>sleepPrint(secondDelay)放到调用堆栈上,并将其与前面的承诺相关联

  • 立即转到下一个“.then”

  • 打印第二条消息。在调用堆栈上不放置任何内容

第二步(JavaScript解释器在相应的承诺得到解决之后,从调用堆栈运行这些步骤中的每一步。)

  • 等待sleepPrint(firstDelay)打印第三条消息并解决,然后转到调用堆栈上的下一项

  • 此插槽的调用堆栈中没有任何内容。没有解决的承诺,因此转到调用堆栈上的下一项。没有生成错误

  • 执行打印第四条消息的函数()=>sleepPrint(secondDelay)。等待承诺得到解决,然后转到调用堆栈上的下一项

  • 此插槽的调用堆栈中没有任何内容。没有解决问题的承诺。没有生成错误


@slebetman提供了正确的代码,并在较高级别上正确地解释了问题和修复。这是我对他的回答更详细的理解。这应该是对他的回答的评论,但太大了

JavaScript解释器对包含chained“.然后”s的代码进行两次遍历

第一关马上就来了,没有任何等待。解释器查看参数to.then,如果看到函数或表达式,则执行不同的操作。函数放在调用堆栈上,并与承诺关联。表达式是evalua