2017-05-25 45 views
0

我試圖從另一個類中調用查詢ID的值,但是當我調用該函數時,它給了我一個承諾鏈,而不是我正在尋找的值。從另一個類的承諾鏈中獲取值

在類 '助手' 的方法是下面

function querySF() { 
 
    var conn = new jsforce.Connection({ 
 
    // you can change loginUrl to connect to sandbox or prerelease env. 
 
    loginUrl: 'https://www.salesforce.com' 
 
    }); 
 

 
    return conn.login('someusername', 'password') 
 
    .then(function(userInfo) { 
 
     // Now you can get the access token and instance URL information. 
 
     // Save them to establish connection next time. 
 
     console.log(conn.accessToken); 
 
     console.log(conn.instanceUrl); 
 
     // logged in user property 
 
     console.log("User ID: " + userInfo.id); 
 
     console.log("Org ID: " + userInfo.organizationId); 
 
     // ... 
 

 
     return conn.query("SELECT Id FROM some place Where name = 'some name'") 
 
    }) 
 
    .then(function(result) { 
 
     console.log("total : " + result.totalSize); 
 
     console.log("fetched : " + result.records.length); 
 
     // is returning the id 
 
     console.log(result.records[0].Id); 
 
     return result.records[0].Id; // can see the id here when debugging 
 
    }) 
 
    .catch(function(err) { 
 
     console.error(err); 
 
    }); 
 
}

我導出這樣的模塊在類的底部:

exports.querySF = querySF(); 

另名爲'BookingEvent'的類調用這樣的方法:var theId = Helper.querySF;並且它返回一個承諾,我已經將承諾打印到控制檯console.log(Helper.querySF);看到的結果:

Promise { 
    _45: 0, 
    _81: 1, 
    _65: 'a0L46111001LyvsEAC', // This is the value I need 
    _54: null, 
    then: [Function], 
    stream: [Function: createRequest] } 

人們認爲我應該能夠只使用

helpers.querySF().then(function(value){ 
    console.log(value); 
}) 

,並能夠獲得價值但我收到此錯誤:

Failed: helpers.querySF is not a function

我對承諾很陌生,在我們公司沒有人能夠解決這個問題。我研究了許多解決承諾的不同方式,但它們不起作用,我也不明白。有人可以幫我解決這個承諾,因此只要我打電話給這個方法,這個ID就可以訪問了,這將會多次使用我將發送的不同查詢。

+1

告訴我,如果這個工程 - 嘗試注入$ q,然後寫:return $ q.when(result.records [0] .Id);並導出到exports.querySF = querySF; –

+1

@Gal這是我的出口問題。我原本應該使用它。 –

回答

0

如果承諾彼此不相關,您可能會發現更好的承諾。所有()在這裏,而不是以這種方式鏈接承諾。然後解決所有這些問題。如果實際上您從第一個承諾中獲得第二個查詢的名稱,實際上您需要鏈接它們。 然後你錯過了一個捕獲,以便爲第一個承諾找出錯誤。

也許重構使用函數可能會幫助代碼看起來更好。

return conn.login('someusername', 'password') 
 
    .then(elaborateUserInfo) 
 
    .catch(catchErrors) 
 
    .then(elaborateResults) 
 
    .catch(catchErrors); 
 
    
 
function elaborateUserInfo(userInfo) { 
 
    // Now you can get the access token and instance URL information. 
 
     // Save them to establish connection next time. 
 
     console.log(conn.accessToken); 
 
     console.log(conn.instanceUrl); 
 
     // logged in user property 
 
     console.log("User ID: " + userInfo.id); 
 
     console.log("Org ID: " + userInfo.organizationId); 
 
     // ... 
 

 
     return conn.query("SELECT Id FROM some place Where name = 'some name'"); 
 
} 
 

 

 
function elaborateResults(result) { 
 
    console.log("total : " + result.totalSize); 
 
    console.log("fetched : " + result.records.length); 
 
    // is returning the id 
 
    console.log(result.records[0].Id); 
 
    return result.records[0].Id; // can see the id here when debugging 
 
} 
 

 
function catchErrors(err) { 
 
    console.log(err); 
 
}

它看起來更好,不是嗎?

取而代之的是,此錯誤Failed: helpers.querySF is not a function的唯一原因是您的對象中沒有該方法。你確定你真的出口它,以便在你的模塊外部可見嗎?

+0

是否可以使conn.login和精心設計的用戶信息功能在整個應用程序中使用並保持靜態?最理想的是conn.login和user在我的自動化開始時登錄,所以它不會不斷重新建立連接。 –

+0

當然可以。但是我需要一些信息才能爲您提供一個很好的例子。你使用哪個版本的角?你是否想在應用程序的開始直接引導這些操作,以便始終保持它們到處都是,或者你想在某些情況下初始化它們? – quirimmo

+0

這將是初始化。我正在使用量角器來測試我的角-js應用程序,所以真的我只使用JavaScript。主要是我要在配置文件的加載時能夠建立連接一次,這基本上是量角器應用程序的主要功能,在準備位於此處。我希望它可以隨時更改登錄名,並且查詢可以用單獨的方法進行更改。 –