简体   繁体   English

异步/等待->是否可能没有返回值?

[英]Async/Await -> Possible without return value?

So, I have a function which does some asynchronous work. 因此,我有一个函数可以执行一些异步工作。

The function currently looks like this ( setTimeout currently is implemented because I haven't managed to implement the async / await way correctly): 该函数当前看起来像这样( setTimeout当前已实现,因为我没有设法正确实现async / await方法):

 function gatherAllRelevantReservationData(TimeFrameStartFromInputfield, TimeFrameEndFromInputfield, liebraum, liebsitz, reservationFromDatabaseTimeFramesStart, reservationFromDatabaseTimeFramesEnd){ console.log("reservationFromDatabaseTimeFramesStart inside gatherAllRelevantReservationData are ", reservationFromDatabaseTimeFramesStart, reservationFromDatabaseTimeFramesEnd) //console.log("TimeFrameStartFromInputfield and TimeFrameEndFromInputfield inside gatherAllRelevantReservationData are ", TimeFrameStartFromInputfield, TimeFrameEndFromInputfield) var timeFrameAsObject = convertDateStringToJavaScriptDateTimeObject(TimeFrameStartFromInputfield, TimeFrameEndFromInputfield) var startDateAsObject = timeFrameAsObject.start var endDateAsObject = timeFrameAsObject.end var timeFrameAsUnixTimeStamp = ConvertToCustomizedUnixTimestampString(startDateAsObject, endDateAsObject) var startDateAsUnixTimeStamp = timeFrameAsUnixTimeStamp.start; var endDateAsUnixTimeStamp = timeFrameAsUnixTimeStamp.end; getTable(startDateAsUnixTimeStamp, endDateAsUnixTimeStamp, liebraum); if(FavSeatcheckHasBeenEnabled == 1){ setTimeout(function(){ prepareSelectedAndDatabaseDateStringsForComparison(startDateAsObject, endDateAsObject, liebraum, liebsitz, reservationFromDatabaseTimeFramesStart, reservationFromDatabaseTimeFramesEnd); }, 300) } }; 

The getTable function requires some time and needs to have finished before prepareSelectedAndDatabaseDateStringsForComparison is called. 在调用prepareSelectedAndDatabaseDateStringsForComparison之前, getTable函数需要一些时间并且需要完成。 The problem is that getTable doesn't have any return value. 问题是getTable没有任何返回值。

I'm pretty new to ES7 async / await features as well as to ES6 promises. 我对ES7 async / await功能以及ES6 Promise还是很陌生的。 I know that await usually expects some promise to be returned, and I probably could arrange this in some very hacky, nasty way. 我知道,await通常期望可以兑现一些诺言,而且我可能会以一种非常卑鄙,令人讨厌的方式安排它。

But I'd like to know if there is any other, elegant way around this. 但我想知道是否还有其他优雅的方法可以解决此问题。

Ideally, I'd just like to attach async to gatherAllRelevantReservationData and then put an "await" in front of getTable call, but this of course did not work. 理想情况下,我只想将async附加到gatherAllRelevantReservationData ,然后在getTable调用之前放置一个“ await”,但这当然不起作用。

Any ideas how I could solve this? 有什么想法可以解决这个问题吗?

EDIT: Here is the "getTable" function: 编辑:这是“ getTable”函数:

 function getTable(start, ende, liebraum) { //console.log("start in getTable is " + start) //console.log("ende in getTable is " + ende) fillRooms(liebraum); $.post("../include/returnTable.php", { anfang: start, ende: ende, art: art }, function(data){ document.getElementById("tablediv").innerHTML= data; console.log("start inside callback of AJAX inside getTabel is ", start) //console.log("data after getTable function " + data); //fillRooms(liebraum); }) } 

If you wish to use async / await , you need to change getTable to return a Promise (or some thenable), because only they can be await ed. 如果您希望使用async / await ,则需要更改getTable来返回Promise (或某些thenable),因为只有它们可以被await

Fix your getTable to return the $.post call, so that its success can then be detected in gatherAllRelevantReservationData function, and then you can simply await the call of getTable : 修复getTable以返回$.post调用,以便随后可以在gatherAllRelevantReservationData函数中检测到它的成功,然后可以简单地awaitgetTable的调用:

async function gatherAllRelevantReservationData(...) {
  ...
  await getTable(...);
  ...
}
function getTable(start, ende, liebraum) {
  fillRooms(liebraum);
  return $.post("../include/returnTable.php", {
    anfang: start,
    ende: ende,
    art: art
  }, function(data) {
    document.getElementById("tablediv").innerHTML = data;
  })
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM