2017-05-25 10 views
0

別のクラスから呼び出された照会IDの値を取得しようとしていますが、私が期待している値ではなく約束を与える関数を呼び出します。別のクラスのpromiseチェーンから値を取得する

クラスのメソッド 'ヘルパー' は

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;そしてそれは約束を返します、私は約束をコンソールに出力しました

Failed: helpers.querySF is not a function

:それは私がちょうど

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

を使用して、しかし、私はこのエラーを取得していた値を得ることができることができるはずと考えられていた

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

console.log(Helper.querySF);は、結果を確認します

私は約束が新しく、私の会社の誰も問題を解決してくれないようです。私は約束を解決するためのさまざまな方法を研究していますが、うまくいかないし、私も理解しません。誰かがこの約束を解決するのを助けてくれたので、このメソッドを呼び出すたびにidにアクセスできるようになりました。これは、別のクエリで複数回送信されます。

+1

これが動作するかどうかを教えてください。$ qを注入してから書き込んでみてください。return $ q.when(result.records [0] .Id); exports.querySF = querySFへのエクスポート。 –

+1

@Galそれは問題でした、私の輸出。私は元々それを使用していたはずです。 –

答えて

0

約束が互いに関連していない場合、この方法で約束を繋げるのではなく、ここでall()を使う。それから、すべてを解決してください。実際に最初の約束から2番目のクエリの名前を取得する場合、実際にそれらをチェーンする必要があります。 その後、最初の約束のエラーを捕まえるためにキャッチがありません。

おそらくリファクタリング機能を使用すると、コードの見栄えが向上する可能性があります。

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とユーザーが自分のオートメーションの始めにログインしているため、接続が絶えず再確立されていないということです。 –

+0

できることは確かです。しかし、私はあなたに良い例を提供する前に、いくつかの情報が必要です。どの角度の角度を使用していますか?アプリケーションの開始時にこれらの操作を直接ブートストラップして、いつでもどこにでも置くことができますか、場合によってはそれらを初期化したいと思いますか? – quirimmo

+0

これはinitになります。私はangle-jsアプリケーションをテストするために分度器を使用していますので、実際にはjavascriptのみを使用しています。主に私はコンフィギュレーションファイルのロード時に一度接続を確立できるようにしたい、これは基本的に分度器アプリのメインで、準備はここにあります。私はそれが欲しいので、ログインはいつでも変更することができ、クエリは別の方法で行うことができます。 –

関連する問題