美文网首页
promise chain:attach callback vs

promise chain:attach callback vs

作者: Time_Notes | 来源:发表于2020-07-05 16:19 被阅读0次

a promise is an object representing the eventual completion or failure of an asynchronous operation.

essentially, a promise is a returned object to which you attach callbacks, instead of passing callbacks into a function.

Imagine a function, createAudioFileAsync(), which asynchronously generates a sound file given a configuration record and two callbacks functions, one called if the audio file is successfully created, and the other called if an error occurs.

function successCallback(result){console.log("Audio file ready at URL: "+result);}

function failureCallback(error){console.log("Error generating audio file: "+error);}

createAudioFileAsync(audioSettings,successCallback,failureCallback);


modern functions return a promise you can attach your callbacks to instead:

createAudioFileAsync(audioSettings).then(successCallback,failureCallback);

That's shorthand for:

const promise=createAudioFileAsync(audioSettings);

promise.then(successCallback,failureCallback);


promise chain

Here's the magic: the then() function returns a new promise, different from the original:

const promise=doSomething();

const promise2=promise.then(successCallback,failureCallback);

or

const promise2=doSomething().then(successCallback,failureCallback);

In the old days, doing several asynchronous operations in a row would lead to the classic callback pyramid of doom:

doSomething(function(result){

    doSomethingElse(result,function(newResult{

        doThirdThing(newResult,function(finalResult){

            console.log('Got the final result:'+finalResult);

        },failureCallback);

    },failureCallback);

},failureCallback);

With modern functions, we attach our callbacks to the returned promises instead, forming a promise chain:

doSomething()

.then(function(result){

    returndoSomethingElse(result);

})

.then(function(newResult{

    returndoThirdThing(newResult);

})

.then(function(finalResult){

    console.log('Got the final result: '+finalResult);})

.catch(failureCallback);

The arguments to then are optional, and catch(failureCallback) is short for then(null, failureCallback). You might see this expressed with arrow functions instead:

doSomething()

.then(result=>doSomethingElse(result))

.then(newResult=>doThirdThing(newResult))

.then(finalResult=>{console.log(`Got the final result: ${finalResult}`);})

.catch(failureCallback);


1: 对同一个promise对象同时调用then方法

var aPromise=new Promise(function(resolve){resolve(100);});

aPromise.then(function(value){returnvalue*2;});

aPromise.then(function(value){returnvalue*2;});

aPromise.then(function(value){console.log("val: "+value);// => 100})

第1种写法中并没有使用promise的方法链方式,这在Promise中是应该极力避免的写法。这种写法中的then调用几乎是在同时开始执行的,而且传给每个then方法的value值都是100。

 2: 对then进行 promise chain 方式进行调用

var bPromise=new Promise(function(resolve){resolve(100);});

bPromise.then(function(value){returnvalue*2;})

.then(function(value){returnvalue*2;})

.then(function(value){console.log("2: "+value);// => 100 * 2 * 2});

第2中写法则采用了方法链的方式将多个then方法调用串连在了一起,各函数也会严格按照 resolve → then → then → then 的顺序执行,并且传给每个then方法的value的值都是前一个promise对象通过return返回的值。


在Promise中,我们可以选择多种方法来实现处理的按顺序执行。

循环使用then调用的方法

使用for循环的方法

使用reduce的方法

分离出顺序处理函数的方法

但是,这些方法都是基于JavaScript中对数组及进行操作的for循环或forEach等,本质上并无大区别。 因此从一定程度上来说,在处理Promise的时候,将大块的处理分成小函数来实现是一个非常好的实践。

相关文章

网友评论

      本文标题:promise chain:attach callback vs

      本文链接:https://www.haomeiwen.com/subject/qbzpbqtx.html