使用异步ajax调用构建对象

时间:2017-12-07 20:20:06

标签: javascript jquery ajax asynchronous

我需要返回一个依赖于多个异步jquery ajax调用的自定义对象。

以下示例代码:

function BuildMyObject() {
    var bp = null;
    var accountId = getAccountId();
    var signature = getSignature();
    var transactionType = getTransactionType();
    var mode = getMode();
    var merchantIdentifier = getMerchantIdentifier();
    jQuery.when(accountId, signature, transactionType, mode, merchantIdentifier).done(function(rAcctId,
        rSig,
        rTransType,
        rMode,
        rMerchId) {
        bp = new MyObject(
            rAcctId[0],
            rSig[0],
            rTransType[0],
            rMode[0],
            rMerchId[0]);
    });
    return bp;
}

现在,返回null;因为return语句在异步调用完成之前触发。有没有办法等待,直到所有的调用都完成后才能返回对象?如果我将ajax调用设置为同步,它可以工作;但我想避免这种情况。

1 个答案:

答案 0 :(得分:2)

您可以使用Promise或回调来处理异步函数的情况



//callback example
function BuildMyObject(callback) {
    var bp = null;
    var accountId = getAccountId();
    var signature = getSignature();
    var transactionType = getTransactionType();
    var mode = getMode();
    var merchantIdentifier = getMerchantIdentifier();
    jQuery.when(accountId, signature, transactionType, mode, merchantIdentifier).done(function(rAcctId,
        rSig,
        rTransType,
        rMode,
        rMerchId) {
        bp = new MyObject(
            rAcctId[0],
            rSig[0],
            rTransType[0],
            rMode[0],
            rMerchId[0]);
            )
        callback(bp)
           
    });
   
}


//or with promise

function BuildMyObject() {
    return new Promise((resolve,reject) =>{
        var bp = null;
        var accountId = getAccountId();
        var signature = getSignature();
        var transactionType = getTransactionType();
        var mode = getMode();
        var merchantIdentifier = getMerchantIdentifier();
        jQuery.when(accountId, signature, transactionType, mode, merchantIdentifier).done(function(rAcctId,
            rSig,
            rTransType,
            rMode,
            rMerchId) {
            bp = new MyObject(
                rAcctId[0],
                rSig[0],
                rTransType[0],
                rMode[0],
                rMerchId[0]);
           )
           resolve(bp)
        });

    }) 
  
   
}

BuildMyObject()
.then((bp) =>{
    //do somthing with bp
})