easy

DocsVersion : 1.0.0

when( args... )

静态方法Define in : promise.js

将多个 promise 实例(无论是同步还是异步)添加到一个队列中,如果所有的实例都是已完成(成功)状态,才执行已完成(成功)的回调,如果有一个实例是已拒绝(失败)状态,则立即执行已拒绝(失败)的回调。

回调函数的参数将依据 when 中添加队列的顺序来传递,如果是已拒绝的回调,只有失败的那个实例会传递参数,其他实例的传参则是 undefined。

这对于需要依赖多个 ajax 请求完成的操作很有用,有效的解决了回调嵌套的问题。

参数
  • args
    promise object
    必需

    一个或多个 promise 实例。

  • 返回值
    • promise object

      promise 实例。

例子1

使用 when 方法将2个 promise 实例添加到队列中,当2个 promise 是都是已完成(成功)状态才去执行已完成(成功)的回调。

var showMsg1 = function(){
    var promise = new E.Promise();
    setTimeout(function(){
        alert( 'ok1' );
        promise.resolve( 'hello1' );
    }, 2000 );

    return promise;
};

var showMsg2 = function(){
    var promise = new E.Promise();
    setTimeout(function(){
        alert( 'ok2' );
        promise.resolve( 'hello2' );
    }, 8000 );

    return promise;
};

E.when( showMsg1(), showMsg2() ).then(function( str1, str2 ){
    alert( str1 + ' ' + str2 );
});

运行

例子2

需要同时获取2个 ajax 请求返回的数据才能进行相关操作,使用 when 方法组合成队列就可以避免回调函数的嵌套。已经对 ajax 方法进行了封装,其返回的就是一个 promise 实例。

// 伪代码
var requests = E.when(E.ajax({
    url : 'test1.php',
    type : 'GET'
}), E.ajax({
    url : 'test2.php',
    type : 'GET'
}));

requests.then(function( arg1, arg2 ){
    console.log( 'success:' + arg1[0] + arg2[0] );
}, function( arg1, arg2 ){
    console.log( 'failure:' + arg1 + arg2  );
});
例子3

使用 when 方法将3个 promise 实例添加到队列中(2个异步,1个同步),当3个 promise 是都是已完成(成功)状态才去执行已完成(成功)的回调。

var showMsg1 = function(){
    var promise = new E.Promise();
    setTimeout(function(){
        alert( 'ok1' );
        promise.resolve( 'hello1' );
    }, 2000 );

    return promise;
};

var showMsg2 = function(){
    var promise = new E.Promise();
    setTimeout(function(){
        alert( 'ok2' );
        promise.resolve( 'hello2' );
    }, 8000 );

    return promise;
};

var showMsg3 = function(){
    var promise = new E.Promise();
    alert( 'ok3' );
    promise.resolve( 'hello3' );
    
    return promise;
};

E.when( showMsg1(), showMsg2(), showMsg3() ).then(function( str1, str2, str3 ){
    alert( str1 + ' ' + str2 + ' ' + str3 );
});

运行