2017-12-07 2 views
0

Ich muss ein benutzerdefiniertes Objekt zurückgeben, das auf mehrere asynchrone JQuery-AJAX-Aufrufe angewiesen ist.Erstellen eines Objekts mit asynchronen AJAX-Aufrufen

Beispielcode unten:

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; 
} 

Nun, dies gibt null; wie die return-Anweisung ausgelöst wird, bevor die asynchronen Aufrufe beendet werden. Gibt es eine Möglichkeit zu warten, bis alle Anrufe beendet sind, bevor das Objekt zurückgegeben wird? Wenn ich die Ajax-Aufrufe auf synchronisiere, funktioniert es; aber ich möchte das vermeiden.

+1

einfach 'Rückkehr jQuery.when (..)' –

Antwort

2

Sie können mit Versprechungen oder Rückrufe für Szenarios von Asynchron-Funktionen arbeiten

//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 
 
})

+0

Für das Versprechen Beispiel könnten Sie einfach zurückgeben ' bp' im '.done' Callback und geben die Kette zurück. z.B. 'return jQuery.when (...). done (...)' statt das gesamte Ding in einen Promise-Konstruktor zu wickeln. – CaseyWebb

+0

@amit; Die Option "Versprechen" sieht so aus, als könnte sie funktionieren. aber wie bekomme ich das bp-objekt zurück? Gerade jetzt scheint es das Versprechensobjekt zurückzugeben; wenn ich wirklich das zusammengesetzte bp-Objekt zurück –

+0

@ JimB möchte ich meine Antwort bearbeiten Sie können sehen, wie Sie bp bekommen. –

Verwandte Themen