2017-07-17 3 views
0

In der Funktion unten versuche ich, das Versprechen Objekt des zweiten Async-Aufrufs zurückzugeben, jedoch klagt Typoskript, dass die Funktion einen Wert zurückgeben muss. Ich bin mir nicht sicher, wie kann ich das erreichen? Wie gebe ich das 2. Versprechen zurück?Rückgabe zweites Versprechen TypeScript Jquery Versprechen

private getSalesUrl<TServiceInput>(serviceCall: (args: TServiceInput) => JQueryPromise<IServiceResponseT>, args): JQueryPromise<any> { 
     serviceCall(args).done(result => { //1st async call 
      if (result.serviceOutput) { 
       if (result.serviceOutput.key === "URL") { 
        return tipsInterop.executeSalesRequest(result.serviceOutput.value); //2nd async call 
       } 
      } 
     }); 
    } 
+0

Die 'return' ist im' done' Rückruf von 'Servicecall()' tauschen. Sie müssen serviceCall (...) zurückgeben, damit die innere Rückgabe von serviceCall zurückgegeben wird. – marekful

+0

Wenn ich den serviceCall zurückgebe, wird getSalesUrl.done() im Kontext des ersten asynchronen Aufrufs ausgeführt . Ich möchte getSaleUrl.done() im Kontext des zweiten asynchronen Aufrufs ausgeführt werden. –

+1

A) niemals 'done' oder' fail' verwenden, immer 'then' verwenden. B) du gibst eigentlich noch nichts von 'getSalesUrl' zurück, du kommst nur 'zurück' von dem erfolgten Callback – Bergi

Antwort

0
  • Nach dem, was die OP angefordert und die SO Kommentare, ich die zweite Anforderung Versprechen der OP muss ich davon aus werden zurück
  • Dies sollte nicht da sein Grund auf Typoskript oder JavaScript begrenzt Funktionalität des ajax-Aufruf
  • Dieses Beispiel verwendet eine einfache Javascript und JQuery ajax fordert

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return "This is the content of second call: id=>" + data2.id; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Hinweis:

  • ich den zweiten Aufruf der Daten in ein Versprechen (standardmäßig, wenn Sie Daten zurückgeben von rufen Sie dann in ein neues Versprechen von @Bergi als kommentierte gewickelt wird) gewickelt bin Rückkehr
  • Dies ist ein Weg abfangen passieren und die Daten
  • der andere Weg, der zweite Aufruf der Daten zu übergeben ist zurück promise2 dh verwenden return promise2 statt return "This is the content of second call: id=>"+ data2.id;
passieren Unten

ist, wie es erscheint, wenn der Sie es mit return promise2;

var requests = { 
 
    firstRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/1'); 
 
    }, 
 
    secondRequest: function() { 
 
    return $.ajax('https://jsonplaceholder.typicode.com/posts/2'); 
 
    } 
 
}; 
 

 
var processResults = { 
 
    callService: function() { 
 
    return requests.firstRequest().then((data, textStatus, promise) => { 
 
     return requests.secondRequest().then((data2, textStatus2, promise2) => { 
 
     return promise2; 
 
     }); 
 
    }); 
 
    } 
 
}; 
 

 
processResults.callService().then((data, textStatus, promise) => { 
 
    console.log(data); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Verwandte Themen