5

这是我想看到的:

kango.invokeAsync('kango.storage.getItem', 'item1', function(returned1) {
    kango.invokeAsync('kango.storage.getItem', 'item2', function(returned2) {
        alert(returned1 + returned2);
    });
});

这是我在coffeescript中写的:

kango.invokeAsync 'kango.storage.getItem', 'item1', (returned1) ->

  kango.invokeAsync 'kango.storage.getItem', 'item2', (returned2) ->

    alert returned1 + returned2

这里的问题是无论如何,coffeescript 都在让函数 ()-> 返回一些东西。在这种情况下,由于某种原因,最后一条语句被返回。

如果我要在嵌套函数中使用return2 放置第二个警报,它将返回而不是第一个:

kango.invokeAsync('kango.storage.getItem', 'item1', function(returned1) {
    kango.invokeAsync('kango.storage.getItem', 'item2', function(returned2) {
      alert(returned1 + returned2);
      return alert('something');
    });

如何让它避免退货?

4

2 回答 2

11

如果您不希望函数返回某些内容,那么只需说return

kango.invokeAsync 'kango.storage.getItem', 'item1', (returned1) ->
  kango.invokeAsync 'kango.storage.getItem', 'item2', (returned2) ->
    alert returned1 + returned2
    return

returnCoffeeScript 中的行为与 JavaScript 中的行为相同,因此您可以说return是否不需要任何特定的返回值。

如果您不使用 指定显式返回值return,CoffeeScript 函数将返回最后一个表达式的值,因此您的 CoffeeScript 等效于:

kango.invokeAsync 'kango.storage.getItem', 'item1', (returned1) ->
  kango.invokeAsync 'kango.storage.getItem', 'item2', (returned2) ->
    return alert returned1 + returned2

结果将是相同的,alert但不会返回任何内容:

f = ->
    alert 'x'
    return
x = f()

会屈服undefinedx但也会如此:

f = -> alert 'x'
x = f()
于 2013-01-06T00:37:25.413 回答
2

在 coffeescript 中,函数总是返回最后的语句。undefined您可以通过使最终语句显式地使函数返回。

kango.invokeAsync 'kango.storage.getItem', 'item1', (returned1) ->

  kango.invokeAsync 'kango.storage.getItem', 'item2', (returned2) ->

    alert returned1 + returned2
    `undefined`
于 2013-01-06T00:20:44.757 回答