2017-03-16 37 views
0

有以下代碼工作的功能:如何調用其中的參數基礎上承諾

let sdk = new SDK({ name: "somevalue"}); 

module.exports=()=> { 
    sdk.dothing(); 
} 

然後我需要改變的參數從異步函數中使用的數據:

let asyncfunc = require('asyncfunc'); 

let sdk = new SDK({ name: (()=>{ 
    return asyncfunc() 
     .then((data) => { 
      return data.value 
     }) 
    }); 

module.exports=()=> { 
    sdk.dothing(); 
} 

繼更改時,由於傳遞的參數爲{},因此asyncFunc承諾尚未解決,因此對新SDK的調用失敗。

一年後我又回到節點,並且承諾新增了。什麼是正確的方法來做到這一點?

回答

0

裏面正如您看到的,你不能在承諾東西是希望傳遞一個字符串。您需要等待異步操作完成。

這意味着你的SDK不會就準備好了,所以你有兩個選擇:

  1. 改變你的模塊,這樣它返回所需的價值承諾。任何需要使用模塊的人都需要使用返回的承諾。

實施例:

let pSdk = asyncFunc() 
    .then(data => new SDK({ name: data.value })); 

module.exports =() => pSdk.then(sdk => sdk.dothing()); 
  • 店中sdk,這不是立即填充值。您的模塊的用戶可以直接獲取SDK實例,但在需要時可能沒有準備好。
  • 實施例:

    let sdk; 
    
    asyncFunc() 
        .then(data => sdk = new SDK({ name: data.value })); 
    
    module.exports =() => { 
        if(!sdk) { throw new Error("The SDK is not ready yet!"); } 
        return sdk.dothing(); 
    }; 
    
    0

    如果節點中的任何位代碼是異步的,那麼立即執行下一位代碼。 (包含在promise中的代碼,編譯器將返回一個待處理的承諾,然後轉到下一個代碼)。當你創建一個代碼時,對象使用new SDK({ })這個名稱引用了尚未解決的未決承諾,這就是爲什麼您的代碼未能滿足您的要求。你可以這樣做來解決你的問題。這裏要注意

    asyncfunc() 
        .then((data) => { 
         return new SDK({ name: data.value }); 
    }).then(function(sdk){ 
        //do your work here using sdk 
    }) 
    

    很重要的一點是,你不能從.then()回到你正在做的值賦給任何變量。從.then()返回的值將可從下一個鏈接.then()訪問,而不是由外部全局變量訪問。 既然要導出sdk.dothing(),所以你需要將它導出最後.then()