Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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_Promise_Es6 Promise - Fatal编程技术网

如何在JavaScript中将承诺链接在一起

如何在JavaScript中将承诺链接在一起,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我试图将一系列承诺串联起来,这样第二个承诺将在第一个承诺解决后开始,依此类推。我不明白我怎么能让它正常工作 这是我的演示代码: const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'a'); }); const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'b');

我试图将一系列承诺串联起来,这样第二个承诺将在第一个承诺解决后开始,依此类推。我不明白我怎么能让它正常工作

这是我的演示代码:

    const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'a'); });
    const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'b'); });
    const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'c'); });

    promise1.then(val => {
      console.log('promise 1', val);
      promise2.then(val2 => {
        console.log('promise 2', val2);
        promise3.then(val3 => {
          console.log('promise 3', val3);
        });
      });
    });
因此,我对这段代码的期望如下:

--- 5 seconds passes ---
// console outputs: 'promise 1a'
--- 5 seconds passes ---
// console outputs: 'promise 2b'
--- 5 seconds passes ---
// console outputs: 'promise 3c'
但实际上发生了什么:

--- 5 seconds passes ---
// console outputs: 'promise 1a'
// console outputs: 'promise 2b'
// console outputs: 'promise 3c'

为什么会这样?为什么这三个承诺同时触发?

为了解释为什么它们都同时完成,我们可以忽略除承诺声明之外的所有内容:

const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'a'); });
const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'b'); });
const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'c'); });
这些承诺是热创建的,即传递给构造函数的处理程序立即被调用,并且都是同时创建的。因此,setTimeout in将在5秒内启动,无论随后如何使用

随后如何使用它们是附带的,然而,为了让示例正常工作,最好编写调用时返回承诺的函数。。。因此:

const getPromise1=>newpromisersolve,reject=>{ setTimeoutresolve,5000,“a”; }; const getPromise2=>newpromisersolve,reject=>{ setTimeoutresolve,5000,'b'; }; const getPromise3=>newpromisersolve,reject=>{ setTimeoutresolve,5000,'c'; }; getPromise1.thenval1=>{ console.logval1; return getPromise2;//通过返回Promise,可以避免深度嵌套 }.thenval2=>{ console.logval2; 归还承诺书3; }.thenval3=>{ console.logval3;
}; 为了解释它们为何同时完成,我们可以忽略除承诺声明之外的所有内容:

const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'a'); });
const promise2 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'b'); });
const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 5000, 'c'); });
这些承诺是热创建的,即传递给构造函数的处理程序立即被调用,并且都是同时创建的。因此,setTimeout in将在5秒内启动,无论随后如何使用

随后如何使用它们是附带的,然而,为了让示例正常工作,最好编写调用时返回承诺的函数。。。因此:

const getPromise1=>newpromisersolve,reject=>{ setTimeoutresolve,5000,“a”; }; const getPromise2=>newpromisersolve,reject=>{ setTimeoutresolve,5000,'b'; }; const getPromise3=>newpromisersolve,reject=>{ setTimeoutresolve,5000,'c'; }; getPromise1.thenval1=>{ console.logval1; return getPromise2;//通过返回Promise,可以避免深度嵌套 }.thenval2=>{ console.logval2; 归还承诺书3; }.thenval3=>{ console.logval3;
}; 承诺在声明后立即开始。然后函数只是一个onResolve事件,即在承诺被解析时调用。 要执行您想要的操作,您需要使用5、10和15秒超时

如果你想要的东西只有在别人叫它的时候才开始,那就去寻找。这是一个很棒的库,它有一些有用的函数来解析和链接响应。
RxJS创建的可观察对象仅在某个对象订阅时启动。

承诺在声明后立即启动。然后,函数只是一个onResolve事件,即在承诺被解析时调用。 要执行您想要的操作,您需要使用5、10和15秒超时

如果你想要的东西只有在别人叫它的时候才开始,那就去寻找。这是一个很棒的库,它有一些有用的函数来解析和链接响应。
RxJS创建的可观察对象只有在有人订阅时才会启动。

我认为最好是用户异步并等待promise主体在创建时立即运行。然后,只有在承诺得到解决后,才决定会发生什么,而不是执行承诺;请看,我认为最好是用户异步,并等待promise主体在创建时立即运行。然后,只有在承诺得到解决后,才决定会发生什么,而不是执行承诺;见Okej。到目前为止我了解。但是现在举个例子,如果我不想得到一系列承诺,这些承诺将以与你的例子中相同的方式执行,那该怎么办?我是否需要创建返回承诺的函数数组???@Dustexe查看我的编辑。很难知道你的具体情况,但希望能指引你正确的方向。到目前为止我了解。但是现在举个例子,如果我不想得到一系列承诺,这些承诺将以与你的例子中相同的方式执行,那该怎么办?我是否需要创建返回承诺的函数数组???@Dustexe查看我的编辑。很难知道你的具体情况,但希望能指引你正确的方向。是的,在@spender指出后,我现在明白了。由于我使用角度,我认为我也可以使用主题,这可能也能解决我的需求。我不知道为什么我一开始就用承诺。我不知道为什么我一开始就用承诺-因为很多异步代码都使用承诺。。。他们是未来看我做了什么异步/等待是伟大的,但有时你可能想p
在获取数据之前重新准备数据,可观测数据上可用的管道操作可能非常有用。如果你使用的是Angular,没有理由不读一点。它可以提供一个很好的方法来抽象和/或泛化一些函数。是的,在@spender指出这一点后,我现在明白了。由于我使用角度,我认为我也可以使用主题,这可能也能解决我的需求。我不知道为什么我一开始就用承诺。我不知道为什么我一开始就用承诺-因为很多异步代码都使用承诺。。。他们是未来的看我在那里做了什么异步/等待是伟大的,但有时您可能想在获取数据之前准备数据,并且在可观察对象上可用的管道操作可能非常有用。如果你使用的是Angular,没有理由不读一点。它可以提供一种很好的方法来抽象和/或泛化某些函数。