javascript promise 的调用链

sengw 发布于 2016/12/12 16:57
阅读 215
收藏 0


[mdn] ref:

链式调用

因为then方法返回一个Promise,你可以轻易地链式调用then。但当返回值不是从  onFulfilled 或者 onRejected 所返回的 Promise 时,它会自动包装为 resolve 过的 Promise 作为返回值.

var p2 = new Promise(function(resolve, reject) { resolve(1); }); p2.then(function(value) { console.log(value); // 1 return value + 1; }).then(function(value)  { console.log(value); // 2 });


第一个then执行完之后,传送onFullfilled的返回值到第二个then的onFullFilled 函数, 

我的意思是这个第二个then可不可以也是异步调用啊, 而不是像上面的例子一样是同步调用?

比如下面这种样子

(new Promise(  function( resolve , reject ) {

})).then(  function( data ){

  console.log( "success" +  ) ;

 //有什么方法可以在这里调用resolve,让第二个then是异步执行

 },

function( info ) {

console.log( "failed" + info );

}). then (  function( data ){

 //被第一个 then 异步触发调用执行

  console.log( "success" +  ) ;

 },

function( info ) {

console.log( "failed" + info );

});

 


 
加载中
1
wuyiw
wuyiw
(new Promise(function (resolve, reject) {
    resolve('first');
})).then(function (data) {

        console.log("success " + data);

        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve('async resolve');
            }, 3e3)
        })

    },

    function (info) {

        console.log("failed " + info);

    }).then(function (data) {

        //被第一个 then 异步触发调用执行

        console.log("success " + data);

    },

    function (info) {

        console.log("failed " + info);

    });



0
uni7corn
uni7corn
先占坑!!
0
张亦俊
张亦俊
没太理解,你是想用Promise.all么?
0
sengw
sengw

大牛 继续请教一个问题 , "new Promise( function ( resolve_cb , reject_cb ) )" 

中的 "resolve_cb" 和 在Promise.resove 是一个东西吗 ?


(new Promise( function( resolve, reject ) {

  setTimeout( function() { 
     resolve();
  }, 1000 ) ;
  return 0;
})).then( function( data ) { 
  console.log( "first async" ); 
  return new Promise( function( resolve,  reject ) { 
     setTimeout( function() { resolve() }, 1000 ); 
    } ); }  ).then( function( ) { console.log( "second async" ) ; } );
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
VM1373:7 first async
VM1373:10 second async
(new Promise( function( resolve, reject ) {
  setTimeout( function() { 
     resolve();
  }, 1000 ) ;
  return 0;
})).then( function( data ) { 
  console.log( "first async" ); 
  return new Promise( function( resolve,  reject ) { 
     setTimeout( function() { resolve() }, 10000 ); 
    } ); }  ).then( function( ) { console.log( "second async" ) ; } );
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
VM1374:7 first async
VM1374:10 second async
0
sengw
sengw

引用来自“wuyiw”的评论

(new Promise(function (resolve, reject) {
    resolve('first');
})).then(function (data) {

        console.log("success " + data);

        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve('async resolve');
            }, 3e3)
        })

    },

    function (info) {

        console.log("failed " + info);

    }).then(function (data) {

        //被第一个 then 异步触发调用执行

        console.log("success " + data);

    },

    function (info) {

        console.log("failed " + info);

    });



大牛 继续请教一个问题 , "new Promise( function ( resolve_cb , reject_cb ) )" 

中的 "resolve_cb" 和 在Promise.resolve 是一个东西吗 ?


0
wuyiw
wuyiw
看文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
0
wuyiw
wuyiw
Promise.resolve是生成一个新的promise对象并用给定参数立即resolve,和cb不同。
0
sengw
sengw

搞清楚了, 关键是理解then 的返回值,

mdn没讲清楚

https://promisesaplus.com/#point-49

返回顶部
顶部