1. Promise的总结

Promise作为Nodejs的曾经的黑科技,一直优待着锐意写出漂亮代码的人们。简而言之,其解决了一个回调陷阱的问题,Nodejs作为以回调为品牌的语言平台,其一直得益于其疯狂的回调模式,网上更有各种评测,其以单线程支撑万计的访问量,颇有点乔峰在聚贤庄的意思。
假设这么一个场景:我们需要读取文件中的数据,然后提取其中我们需要的信息,发送到后台程序中,并接收其结果。代码示意如下:
fs.readFile('aaa.txt', function(content, e){
if(e){
console.info("打开文件失败");
return;
}
let name = content.substring(3,55);
sendToOther(name, function(e){
if(e){
console.info("you lost!");
}else {
console.info("你成功啦");
}
});
});
其实上面的代码看着还行,但是如果我在你成功之后,需要将写日志,日志书写失败,需要发短信,短信发送成功与否,需要记录,以备未来计费。。。
如果一直回调下去,我估计已经没有人能回得来神了。试想,我们在看源码的时候,经常头疼的就是调用栈,看到里面,想不起外面的上下文是什么情况,又从debugger里点出来,看外面一层的方法调用的上下文,以及其想干个啥。

那么Promise就是为了解决此问题,而出现的。上代码:
首先要明白,链式调用,现在许多程序,尤其是一些cs的程序都喜欢这个调调,其核心就是被设置或处理的主体即this,会在处理完成后返回。
那么上面的程序,我们如何进行Promise呢。
new Promise(function(resolve, reject){
fs.readFile('aaa.txt', function(content){
if(e){
reject("打开文件失败");
return ;
}
resolve(content);
// 以下程序会立即执行,不会等待resolve返回的
console.info("I will be printed right now!!!!!")
}).then(function(content){
let name = content.substring(3,55);
return name;
}).then(function(name){ // ******1******
return new Promise(function(resolve, reject)){
sendToOther(name, function(e){
if(e){
console.info("you lost!");
reject("lost when sendToOther");
}else {
console.info("你成功啦");
resolve("ok");
}
});
}
}).then(function(ok)){
//ok is ok
// go to send sms
}catch(function(e){
console.error(e);
});
});
由上述代码,可以知道,其实首个方法,用new Promise来解决,其里面的回调里,可以用then来解决同步的调用,如果想用 then来解决异步的回调,这时候,要动用then里返回Promise的方法来重新开始。
所以有两个地方要明确:
1、then方法时要两个参数,当然后者经常省略。用typescript的限制写法,可以如下:
fufilled:(a:any)=>any
failed:(a:any)=>any
ps:then中的函数,只能来传传递一个参数,不能是多个
那么,以下的方法都可以认为是第一个参数有值,第二个没值
如果想重新连起来,就弄个函数,接收上面的参数,并且返回一个Promise
2、如果想处理then中的回调,需要用新的Promise来返回
3、注意程序执行顺序,跟在resolve和reject后的内容会立即执行,不是等你的resolve返回后才执行。所以可以理解,Promise仅来协调resolve和then中指定的代码执行顺序。

以上是个架子,大体讲解了Promise的用法,及我初次使用时的困惑。BlueBird的api还有很多便利性的api,是对其的封装,随后总结。。。

### 回答1: Promise.all 是 JavaScript 中的一个方法,用于将多个 Promise 实例包装成一个新的 Promise 实例。这些原始的 Promise 实例在全部都变为 fulfilled 状态(成功状态)后,新的 Promise 实例才会变为 fulfilled 状态。如果有任意一个原始的 Promise 实例变为 rejected 状态(失败状态),那么新的 Promise 实例就会立刻变为 rejected 状态。 下面是一个使用 Promise.all 的示例: ``` const promise1 = Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 100, 'foo'); }); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); }); // expected output: Array [3, 42, "foo"] ``` 在这个例子中,Promise.all 方法接受一个数组作为参数,这个数组包含三个 Promise 实例,并返回一个新的 Promise 实例。当所有的三个原始的 Promise 实例都变为 fulfilled 状态后,新的 Promise 实例才会变为 fulfilled 状态,并且传递给 then 方法的回调函数会被调用。 ### 回答2: Promise.all是一个方法,它接收一个Promise对象数组作为参数,并返回一个新的Promise对象。这个新的Promise对象会在所有的Promise对象都成功执行后被resolve,或者其中一个Promise对象出现错误后被reject。 使用Promise.all的好处是可以并行地执行多个异步操作,并且在所有异步操作都完成后再进行下一步处理。例如,假设有三个异步操作a、b和c,我们希望在它们都完成后才执行下一步操作。我们可以将这三个异步操作封装为Promise对象,然后使用Promise.all来处理它们。 具体步骤如下: 1. 创建需要执行的异步操作a、b和c的Promise对象。 2. 将这三个Promise对象放入一个数组中。 3. 调用Promise.all方法,将上一步中的数组作为参数传入。 4. 使用then方法来处理Promise.all返回的新Promise对象。在then方法中,我们可以获取到a、b和c异步操作的结果。 使用Promise.all的一个典型应用场景是同时请求多个接口并获取结果。当我们需要从多个接口获取数据时,可以使用Promise.all来并行请求,提高请求效率。 需要注意的是,如果Promise.all中的某个Promise对象出现错误,整个Promise.all的返回结果将会被reject。因此,我们需要在then方法中使用catch来处理异常情况。另外,如果Promise对象数组中有一个不是Promise对象,Promise.all将会报错。 总结来说,Promise.all提供了一种并行执行多个异步操作的方法,可以方便地处理多个异步任务的结果。它的使用可以简化异步编程,并提供更好的性能和可读性。 ### 回答3: Promise.all 是一个 Promise 静态方法,接收一个由 Promise 对象组成的数组作为参数,并返回一个新 Promise 对象。 当传入的数组中所有的 Promise 对象都变为 fulfilled 状态时,返回的 Promise 对象的状态才会变为 fulfilled,且返回值是一个数组,其中包含了所有 Promise 对象的返回值。 当传入的数组中任意一个 Promise 对象变为 rejected 状态时,返回的 Promise 对象的状态会变为 rejected,并返回第一个被 reject 的 Promise 对象的错误信息。 使用 Promise.all 的好处是可以同时处理多个异步操作,等到所有异步操作都完成后再做统一的处理。这样可以提高效率,减少代码的复杂度。 使用 Promise.all 的步骤如下: 1. 创建一个 Promise 对象数组,数组中的每个 Promise 对象代表一个异步操作。 2. 使用 Promise.all 方法,并将上一步创建的 Promise 对象数组作为参数传入。 3. 使用 then 方法来处理 Promise 对象,在回调函数中可以获取到所有异步操作返回的结果。 4. 使用 catch 方法来捕获异常并处理错误情况。 例如,下面的示例代码演示了使用 Promise.all 来同时请求多个接口的例子: ```javascript const promise1 = fetch('http://api1.example.com/data'); const promise2 = fetch('http://api2.example.com/data'); const promise3 = fetch('http://api3.example.com/data'); Promise.all([promise1, promise2, promise3]) .then(response => { // 处理返回的结果 console.log(response); }) .catch(error => { // 处理异常情况 console.error(error); }); ``` 上面的示例中,我们创建了三个 Promise 对象来请求三个不同的接口,然后使用 Promise.all 方法来同时处理这三个异步操作。当所有接口的请求都成功完成时,then 方法会返回一个包含了所有请求结果的数组,我们可以在回调函数中进行后续的操作。如果其中任意一个接口请求失败了,就会执行 catch 方法中的回调函数,来处理错误情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值