Scala Async和Await Restrictions

时间:2015-09-25 09:47:02

标签: scala asynchronous

我有一个像这样的代码块:

val await1: List[Int] = await(futureMethod(id))

val mapped = await1.map(entry => {
  (pq.id, await(anotherFutureMethod(entry.id)))
})

这是因为" await不能在嵌套函数下使用"我怎么能绕过这个?为什么这会成为问题?

2 个答案:

答案 0 :(得分:4)

我不得不猜测你的函数的签名,但是一个例子看起来像这样:

def futureMethod(id: Int): Future[List[Int]] = Future.successful(0 to id toList)
def anotherFutureMethod(id: Int): Future[String] = Future.successful(id.toString)

def finalFuture(id: Int) = async {
  val await1 = await(futureMethod(id))
  val mapped = Future.sequence(await1 map anotherFutureMethod)

  await(mapped)
}

使用Future.sequence可能是一种可能的非阻止解决方案,以避免使用嵌套的await调用。

答案 1 :(得分:1)

你想要链接未来的电话,而不是阻止它们。闭塞 期货违背了未来的目的。

$('input[name^="meals"]').change(function() {
        var sum = 0;
        $(this).closest('fieldset').find('input[name^="meals"]').each(function({
            //loop only those elements which are inside that fieldset
            sum+= parseInt($(this).val());
        });

        // Set the sum
        $(this).closest('fieldset').find('.sum').val(sum);
        //get `.sum`  belonging to `fieldset` to which current input belongs
        // If the sum == 7 then show the button otherwise
        // hide it
        if (sum == 7) {
            $('#button-cart').closest('.btn').show();
            $("div.error").html("Your percentage fields must sum to 7.").hide();
        }
        else {
            $('#button-cart').closest('.btn').hide();
            $("div.error").html("Your percentage fields must sum to 7.").show();
        }
});