2014-12-04 40 views
0

我只是試圖讓我的頭腦繞過JavaScript Promises,而我對某事感到困惑。在JavaScript Promise聲明中定義變量而不是外部

以下兩個函數有什麼區別?

function func_1() 
{ 
    var myArgs = Array.prototype.slice.call(arguments), 
     arg_1 = (myArgs[1]) ? myArgs[1] : 1, 
     arg_2 = (myArgs[2]) ? myArgs[2] : 2 
     ; 

    return new Promise(function(resolve, reject) { 
     var result = arg_1 + arg_2; 
     resolve(result); 
    }); 
} 

function func_2() 
{  
    return new Promise(function(resolve, reject) 
    { 
     var myArgs = Array.prototype.slice.call(arguments), 
      arg_1 = (myArgs[1]) ? myArgs[1] : 1, 
      arg_2 = (myArgs[2]) ? myArgs[2] : 2 
      ; 

     var result = arg_1 + arg_2; 
     resolve(result); 
    }); 
} 

回答

0

你的第一個功能,將工作像您期望的,因爲它訪問func_1()呼叫arguments object

您的第二個函數訪問您傳遞給Promise構造函數的匿名回調函數的arguments。這裏,myArgs == [resolve, reject]

請注意,您的任務,你不應該使用Promise構造,其回調可言,但Promise.resolve function

function func(_, arg1, arg2) { 
    return Promise.resolve((arg1 || 1) + (arg2 || 2)); 
} 
+0

謝謝。這使得它更清晰。點也用於優雅的代碼壓縮。 – 2014-12-04 19:59:54

0

在您的例子,這兩個函數將導致基本相同的行爲,與在func_2中,你的參數將引用Promise回調的參數,而不是func_2閉包的參數,這肯定會導致代碼中的錯誤。然而,這個例子並沒有真正以他們設計的方式使用Promises。

理解承諾如何工作的最好方法是使用它來處理異步行爲。因此,如果將示例更改爲以下內容:

function func_1() 
{ 
    return new Promise(function(resolve, reject) { 
     $.get('stuff.json') 
     .success(function (result) { 
      resolve(result); 
     }).fail(function() { 
      reject(); 
     }); 
    }); 
} 

在此示例中,promise使用jQuerys get方法啓動異步請求。當請求成功或失敗時,它可以調用解析或拒絕。所以,你會在你的代碼中使用func_1的方式是類似如下:

func_1().done(function (result) { 
    // do something with the result 
}); 

僅供參考,這個例子是有點做作,因爲$不用彷徨已經返回一個承諾,你基本上可以做同樣的事情。

+0

謝謝奧馬爾。非常感激。 – 2014-12-04 20:00:09

+0

承諾中沒有'done'方法? – Bergi 2014-12-04 20:01:41