2017-10-10 64 views
0
a = _.map(b, set); 
    console.log(a); 

    function set(item) { 
     var cpt = item.code; 

     var options = ["code"]; 
     RS.getCodes(cpt).then(function(response) { 
      options = options.concat(_.map(response, options)); 
      console.log(ndcOptions); 
      return options; 
     }); 
    } 

在我的計劃,我想申請功能set的每個元素在B名單,產生一個新的列表a。但是我覺得有一些異步執行set的功能,當我打印a時,它給了我一個空白列表,並且所有console.log(ndcOptions);都在console.log(a);執行後執行。我想知道是否有任何方法可以避免JS中的這種行爲,因此a將在執行console.log(a);之前及其後的所有行被完全分配。下劃線地圖行爲

+0

是的,'RS.getCodes(cpt)'似乎會返回一個承諾。 *「我想知道是否有任何方法可以避免JS中的這種行爲」*您必須編寫代碼,以便將方法的異步性考慮在內。如果您的代碼的任何步驟是異步的,則整個過程需要是異步的。 –

+0

@FelixKling我在'RS.getCodes(cpt)'之後調用'.then''所以我認爲可以避免異步行爲? – xxx222

+0

你不是在避免異步行爲。所有'.then'確實提供了一種方法來指定*數據何時可用,應該發生什麼。所以你說*「當數據可用時,執行'options.concat(...)'」*。然而,在你調用'console.log(a)'(這實際上是由JavaScript保證的,任何傳遞給'.then'的回調函數將在下一個事件循環中執行)之後,這一時刻將會在未來的某個時間點。 –

回答

2

我想知道是否有任何方法可以避免JS中的這種行爲,所以a將在執行console.log(a)之前完全分配;以及之後的所有行。

由於您想調用一組項目的異步函數,因此一般的解決方案是爲每個項目創建一個承諾,並使用Promise.all來等待所有項目。

對現有代碼的更改很少。您需要做的就是從set返回承諾。

Promise.all(_.map(b, set)).then(function(a) { 
    console.log(a); 
    // Anything that needs access to `a` needs to be in or called from here 
}); 

function set(item) { 
    var cpt = item.code; 

    var options = ["code"]; 
    return RS.getCodes(cpt).then(function(response) { 
//^^^^^^ return the created promise 
     options = options.concat(_.map(response, options)); 
     console.log(ndcOptions); 
     return options; 
    }); 
}