使用Promise解决多层异步调用的简单学习心得(3)

我们已经知道,如果上一个onFulfilled函数返回了一个普通的值,那么这个值为作为这个onFulfilled函数的入参;那么如果上一个onFulfilled返回了一个Promise变量,这个onFulfilled的入参又来自哪里?

答案是,这个onFulfilled函数的入参,是上一个Promise中调用resolve函数时传入的值。

跳跃的有点大一时间无法接受对不对,让我们来好好缕一缕。

首先,Promise.resolve这个函数是什么,用MDN上面文邹邹的说法

用成功值value解决一个Promise对象。如果该value为可继续的(thenable,即带有then方法),返回的Promise对象会“跟随”这个value

简而言之,这就是异步调用成功情况下的回调。

我们来看看普通的异步接口中,成功情况的回调是什么样的,就拿nodejs的上的fs.readFile(file[, options], callback)来说,它的典型调用例子如下

fs.readFile('/etc/passwd', function (err, data) { if (err) throw err; console.log(data); });

因为对于fs.readFile这个函数而言,无论成功还是失败,它都会调用callback这个回调函数,所以这个回调接受两个入参,即失败时的异常描述err和成功时的返回结果data。

那么假如我们用Promise来重构这个读取文件的例子,我们应该怎么写呢?

首先是封装fs.readFile函数:

function readFile(fileName) { return new Promise(function(resolve, reject) { fs.readFile(fileName, function (err, data) { if (err) { reject(err); } else { resolve(data); } }); }); }

其次是调用:

readFile('theFile.txt').then( function(data) { console.log(data); }, function(err) { throw err; } );

想象一下,在其他语言的读取文件的同步调用接口的里面,文件的内容通常是放在哪里?函数返回值对不对!答案出来了,这个resolve的入参是什么?就是异步调用成功情况下的返回值。

有了这个概念之后,我们就不难理解“onFulfilled函数的入参,是上一个Promise中调用resolve函数时传入的值”这件事了。因为onFulfilled的任务,就是对上一个异步调用成功后的结果做处理的。

哎终于理顺了。。。

总结

下面请允许我用一段代码对本文讲解到的要点进行总结:

function callp1() { console.log(Date.now() + " start callp1"); return new Promise(function(res, rej) { setTimeout(res, 2000); }); } function callp2() { console.log(Date.now() + " start callp2"); return new Promise(function(res, rej) { setTimeout(function() { res({arg1: 4, arg2: "arg2 value"}); }, 3000); }); } function callp3(arg) { console.log(Date.now() + " start callp3 with arg = " + arg); return new Promise(function(res, rej) { setTimeout(function() { res("callp3"); }, arg * 1000); }); } callp1().then(function() { console.log(Date.now() + " callp1 return"); return callp2(); }).then(function(ret) { console.log(Date.now() + " callp2 return with ret value = " + JSON.stringify(ret)); return callp3(ret.arg1); }).then(function(ret) { console.log(Date.now() + " callp3 return with ret value = " + ret); })

$ node promisTest.js 1450191479575 start callp1 1450191481597 callp1 return 1450191481599 start callp2 1450191484605 callp2 return with ret value = {"arg1":4,"arg2":"arg2 value"} 1450191484605 start callp3 with arg = 4 1450191488610 callp3 return with ret value = callp3

以上这篇使用Promise解决多层异步调用的简单学习心得就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzpfzs.html