簡體   English   中英

從匿名javascript函數中獲取變量

[英]Get variable out of anonymous javascript function

我正在使用匿名函數對使用Restler的get函數返回的html執行一些工作:

var some_function() {
    var outer_var;
    rest.get(url).on('complete', function(result, response) {
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            outer_var = inner_var;
        }
    });
    return outer_var;
}

如何將inner_var的值獲取到some_function范圍並將其返回? 我在這里寫的東西行不通。

get調用是異步的,需要一些時間,稍后再調用您的回調。 但是,在調用get之后,腳本將繼續執行並轉到下一條指令。 所以這是發生了什么:

  • 你打電話給
  • 您返回external_var(仍未定義)...有時稍后...
  • 獲取結果已到達,並調用了回調。
  • 設置了external_var

您不能讓some_function返回異步值,因此您將不得不使用回調,並在處理完數據后讓代碼對其進行調用。

var some_function(callback) {
    rest.get(url).on('complete', function(result, response) {
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            callback(inner_var);
        }
    });
}

像節點的大多數模塊一樣,Restler還是基於事件的具有異步調用的庫。 因此,此時您確實return outer_var; complete回調不一定被調用(對於某些庫,如果結果被緩存,則可能是這樣,但是您應該始終期望將其稱為異步)。

如果添加一些日志記錄,則可以看到此行為:

var some_function() {
    var outer_var;
    console.log("before registration of callback"); //<----------
    rest.get(url).on('complete', function(result, response) {
        console.log("callback is called");  //<----------
        if (result instanceof Error) {
            sys.puts('Error: ' + result.message);
        } else {
            var inner_var;
            // do stuff on **result** to build **inner_var**
            outer_var = inner_var;
        }
    });
    console.log("after registration of callback");  //<----------
    return outer_var;
}

因此,如果您想使用此值做某事,則需要從完整的回調函數中調用應該使用該值做某事的函數。

  1. 刪除var outer_var; 從您的功能some_function ;
  2. 聲明var outer_var; 上層然后你的功能

完成步驟1之后,應該就可以工作了,而實際上並不需要步驟2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM