如何在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,没有理由不读一点。它可以提供一种很好的方法来抽象和/或泛化某些函数。